/*------------------------------------------------------------------------
*
* Copyright (c) 1997-1998 by Cornell University.
*
* See the file "license.txt" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* demux.c
*
* Wei-Tsang Ooi weitsng@cs.cornell.edu
*
* Usage : demux mpegSystem streamId output
*
* Takes an MPEG-1 system stream, and an id of the stream to extract. This
* programs extract the stream and dumped it into a file.
*
* NOTE : There are more than one way to demux a stream. This example
* uses the SysToc structure. This structure is provided for convinience
* but it does not follow Dali's philosophies since it hides many details
* including memory allocation. There is also no way for the programmer to
* specifies which stream the SysToc should include/exclude. Please see
* another example demux2.c which uses hdr find/parse/skip to demux a stream.
*
*------------------------------------------------------------------------
*/
#include <dvmbasic.h>
#include <dvmmpeg.h>
int main(int argc, char *argv[])
{
BitParser *bp;
BitStream *bs;
FILE *inf, *outf;
int id, len, off;
MpegSysToc *toc;
BitStreamFilter *filter;
/*
* Parse arguments and open input file.
*/
if (argc < 4) {
fprintf(stderr, "usage : %s input streamId output", argv[0]);
exit(1);
}
id = atoi(argv[2]);
inf = fopen(argv[1], "rb");
if (inf == NULL) {
fprintf(stderr, "unable to open file %s\n", argv[1]);
exit(1);
}
/*
* Initialize input bitstream and bitparser.
*/
bp = BitParserNew();
bs = BitStreamNew(65536);
BitParserWrap (bp, bs);
len = BitStreamFileRead(bs, inf, 0);
/*
* Creates a new MpegSysToc structure. Read a bunch of bytes from
* input bitstream and call MpegSysTocAdd to parse the bitstream and
* create entries in SysToc. We repeat until we reach the end of
* files.
*/
toc = MpegSysTocNew();
off = 0;
MpegSysTocAdd(bp, toc, off);
while (!feof(inf)) {
int pos, bytesInBuf;
pos = BitParserTell (bp);
bytesInBuf = 65536-pos;
BitStreamShift(bs, pos);
off += pos;
len = BitStreamFileRead(bs, inf, bytesInBuf);
BitParserSeek(bp, 0);
MpegSysTocAdd(bp, toc, off);
}
/*
* We rewinds to the beginning of the input file. And creates a new
* output file.
*/
fseek(inf, 0, SEEK_SET);
outf = fopen(argv[3], "wb");
if (outf == NULL) {
fprintf(stderr, "unable to open file %s\n", argv[3]);
exit(1);
}
/*
* We find the filter for the corresponding stream we are interested in.
*/
filter = MpegSysTocGetFilter(toc, id);
/*
* Using that filter, we read in segments corresponding to the stream,
* and dump it out to the output file.
*/
len = BitStreamFileFilterIn(bs, inf, 0, filter);
while (len == 65536) {
BitStreamFileWriteSegment(bs, outf, 0, len);
len = BitStreamFileFilterIn(bs, inf, 0, filter);
}
BitStreamFileWriteSegment(bs, outf, 0, len);
/*
* Finally we clean up the structures we allocated.
*/
MpegSysTocFree(toc);
BitStreamFree(bs);
fclose(inf);
fclose(outf);
return 0;
}