int main(int argc, char *argv[]) { avi_t *avifile, *avifile1, *avifile2; char *outfile=NULL, *infile=NULL, *audfile=NULL; long rate, mp3rate; int j, ch, cc=0, track_num=0, out_track_num=-1; int width, height, format=0, format_add, chan, bits, aud_error=0; double fps; char *codec; long offset, frames, n, bytes, aud_offset=0; int key; int aud_tracks; // for mp3 audio FILE *f=NULL; int len, headlen, chan_i, rate_i, mp3rate_i; unsigned long vid_chunks=0; char head[8]; off_t pos; double aud_ms = 0.0, vid_ms = 0.0; double aud_ms_w[AVI_MAX_TRACKS]; ac_init(AC_ALL); if(argc==1) usage(EXIT_FAILURE); while ((ch = getopt(argc, argv, "A:a:b:ci:o:p:f:x:?hv")) != -1) { switch (ch) { case 'i': if(optarg[0]=='-') usage(EXIT_FAILURE); infile = optarg; break; case 'A': if(optarg[0]=='-') usage(EXIT_FAILURE); out_track_num = atoi(optarg); if(out_track_num<-1) usage(EXIT_FAILURE); break; case 'a': if(optarg[0]=='-') usage(EXIT_FAILURE); track_num = atoi(optarg); if(track_num<0) usage(EXIT_FAILURE); break; case 'b': if(optarg[0]=='-') usage(EXIT_FAILURE); is_vbr = atoi(optarg); if(is_vbr<0) usage(EXIT_FAILURE); break; case 'c': drop_video = 1; break; case 'o': if(optarg[0]=='-') usage(EXIT_FAILURE); outfile = optarg; break; case 'p': if(optarg[0]=='-') usage(EXIT_FAILURE); audfile = optarg; break; case 'f': if(optarg[0]=='-') usage(EXIT_FAILURE); comfile = optarg; break; case 'x': if(optarg[0]=='-') usage(EXIT_FAILURE); indexfile = optarg; break; case 'v': version(); exit(EXIT_SUCCESS); case 'h': usage(EXIT_SUCCESS); default: usage(EXIT_FAILURE); } } if(outfile == NULL || infile == NULL) usage(EXIT_FAILURE); printf("scanning file %s for video/audio parameter\n", infile); // open first file for video/audio info read only if(indexfile) { if (NULL == (avifile1 = AVI_open_input_indexfile(infile,0,indexfile))) { AVI_print_error("AVI open with index file"); } } else if(NULL == (avifile1 = AVI_open_input_file(infile,1))) { AVI_print_error("AVI open"); exit(1); } AVI_info(avifile1); // safety checks if(strcmp(infile, outfile)==0) { printf("error: output filename conflicts with input filename\n"); exit(1); } ch = optind; while (ch < argc) { if(tc_file_check(argv[ch]) != 0) { printf("error: file not found\n"); exit(1); } if(strcmp(argv[ch++], outfile)==0) { printf("error: output filename conflicts with input filename\n"); exit(1); } } // open output file if(NULL == (avifile = AVI_open_output_file(outfile))) { AVI_print_error("AVI open"); exit(1); } // read video info; width = AVI_video_width(avifile1); height = AVI_video_height(avifile1); fps = AVI_frame_rate(avifile1); codec = AVI_video_compressor(avifile1); //set video in outputfile AVI_set_video(avifile, width, height, fps, codec); if (comfile!=NULL) AVI_set_comment_fd(avifile, open(comfile, O_RDONLY)); //multi audio tracks? aud_tracks = AVI_audio_tracks(avifile1); if (out_track_num < 0) out_track_num = aud_tracks; for(j=0; j<aud_tracks; ++j) { if (out_track_num == j) continue; AVI_set_audio_track(avifile1, j); rate = AVI_audio_rate(avifile1); chan = AVI_audio_channels(avifile1); bits = AVI_audio_bits(avifile1); format = AVI_audio_format(avifile1); mp3rate= AVI_audio_mp3rate(avifile1); //printf("TRACK %d MP3RATE %ld VBR %ld\n", j, mp3rate, AVI_get_audio_vbr(avifile1)); //set next track of output file AVI_set_audio_track(avifile, j); AVI_set_audio(avifile, chan, rate, bits, format, mp3rate); AVI_set_audio_vbr(avifile, AVI_get_audio_vbr(avifile1)); } if(audfile!=NULL) goto audio_merge; // close reopen in merger function AVI_close(avifile1); //------------------------------------------------------------- printf("merging multiple AVI-files (concatenating) ...\n"); // extract and write to new files printf ("file %02d %s\n", ++cc, infile); merger(avifile, infile); while (optind < argc) { printf ("file %02d %s\n", ++cc, argv[optind]); merger(avifile, argv[optind++]); } // close new AVI file AVI_close(avifile); printf("... done merging %d file(s) in %s\n", cc, outfile); // reopen file for video/audio info if(NULL == (avifile = AVI_open_input_file(outfile,1))) { AVI_print_error("AVI open"); exit(1); } AVI_info(avifile); return(0); //------------------------------------------------------------- // ************************************************* // Merge the audio track of an additional AVI file // ************************************************* audio_merge: printf("merging audio %s track %d (multiplexing) into %d ...\n", audfile, track_num, out_track_num); // open audio file read only if(NULL == (avifile2 = AVI_open_input_file(audfile,1))) { int f=open(audfile, O_RDONLY), ret=0; char head[1024], *c; c = head; if (f>0 && (1024 == read(f, head, 1024)) ) { while ((c-head<1024-8) && (ret = tc_probe_audio_header(c, 8))<=0 ) { c++; } close(f); if (ret > 0) { aud_offset = c-head; //printf("found atrack 0x%x off=%ld\n", ret, aud_offset); goto merge_mp3; } } AVI_print_error("AVI open"); exit(1); } AVI_info(avifile2); //switch to requested track if(AVI_set_audio_track(avifile2, track_num)<0) { fprintf(stderr, "invalid audio track\n"); } rate = AVI_audio_rate(avifile2); chan = AVI_audio_channels(avifile2); bits = AVI_audio_bits(avifile2); format = AVI_audio_format(avifile2); mp3rate= AVI_audio_mp3rate(avifile2); //set next track AVI_set_audio_track(avifile, out_track_num); AVI_set_audio(avifile, chan, rate, bits, format, mp3rate); AVI_set_audio_vbr(avifile, AVI_get_audio_vbr(avifile2)); AVI_seek_start(avifile1); frames = AVI_video_frames(avifile1); offset = 0; printf ("file %02d %s\n", ++cc, infile); for (n=0; n<AVI_MAX_TRACKS; n++) aud_ms_w[n] = 0.0; vid_chunks=0; for (n=0; n<frames; ++n) { // video bytes = AVI_read_frame(avifile1, data, &key); if(bytes < 0) { AVI_print_error("AVI read video frame"); return(-1); } if(AVI_write_frame(avifile, data, bytes, key)<0) { AVI_print_error("AVI write video frame"); return(-1); } ++vid_chunks; vid_ms = vid_chunks*1000.0/fps; for(j=0; j<aud_tracks; ++j) { if (j == out_track_num) continue; AVI_set_audio_track(avifile1, j); AVI_set_audio_track(avifile, j); chan = AVI_audio_channels(avifile1); // audio chan = AVI_audio_channels(avifile1); if(chan) { sync_audio_video_avi2avi(vid_ms, &aud_ms_w[j], avifile1, avifile); } } // merge additional track // audio chan = AVI_audio_channels(avifile2); AVI_set_audio_track(avifile, out_track_num); if(chan) { sync_audio_video_avi2avi(vid_ms, &aud_ms, avifile2, avifile); } // progress fprintf(stderr, "[%s] (%06ld-%06ld)\r", outfile, offset, offset + n); } fprintf(stderr,"\n"); offset = frames; //more files to merge? AVI_close(avifile1); while (optind < argc) { printf ("file %02d %s\n", ++cc, argv[optind]); if(NULL == ( avifile1 = AVI_open_input_file(argv[optind++],1))) { AVI_print_error("AVI open"); goto finish; } AVI_seek_start(avifile1); frames = AVI_video_frames(avifile1); for (n=0; n<frames; ++n) { // video bytes = AVI_read_frame(avifile1, data, &key); if(bytes < 0) { AVI_print_error("AVI read video frame"); return(-1); } if(AVI_write_frame(avifile, data, bytes, key)<0) { AVI_print_error("AVI write video frame"); return(-1); } ++vid_chunks; vid_ms = vid_chunks*1000.0/fps; // audio for(j=0; j<aud_tracks; ++j) { if (j == out_track_num) continue; AVI_set_audio_track(avifile1, j); AVI_set_audio_track(avifile, j); chan = AVI_audio_channels(avifile1); if(chan) { sync_audio_video_avi2avi(vid_ms, &aud_ms_w[j], avifile1, avifile); } } // merge additional track chan = AVI_audio_channels(avifile2); AVI_set_audio_track(avifile, out_track_num); if(chan) { sync_audio_video_avi2avi(vid_ms, &aud_ms, avifile2, avifile); } // chan // progress fprintf(stderr, "[%s] (%06ld-%06ld)\r", outfile, offset, offset + n); } fprintf(stderr, "\n"); offset += frames; AVI_close(avifile1); } finish: // close new AVI file printf("... done multiplexing in %s\n", outfile); AVI_info(avifile); AVI_close(avifile); return(0); // ************************************************* // Merge a raw audio file which is either MP3 or AC3 // ************************************************* merge_mp3: f = fopen(audfile,"rb"); if (!f) { perror ("fopen"); exit(1); } fseek(f, aud_offset, SEEK_SET); len = fread(head, 1, 8, f); format_add = tc_probe_audio_header(head, len); headlen = tc_get_audio_header(head, len, format_add, &chan_i, &rate_i, &mp3rate_i); fprintf(stderr, "... this looks like a %s track ...\n", (format_add==0x55)?"MP3":"AC3"); fseek(f, aud_offset, SEEK_SET); //set next track AVI_set_audio_track(avifile, out_track_num); AVI_set_audio(avifile, chan_i, rate_i, 16, format_add, mp3rate_i); AVI_set_audio_vbr(avifile, is_vbr); AVI_seek_start(avifile1); frames = AVI_video_frames(avifile1); offset = 0; for (n=0; n<AVI_MAX_TRACKS; ++n) aud_ms_w[n] = 0.0; for (n=0; n<frames; ++n) { // video bytes = AVI_read_frame(avifile1, data, &key); if(bytes < 0) { AVI_print_error("AVI read video frame"); return(-1); } if(AVI_write_frame(avifile, data, bytes, key)<0) { AVI_print_error("AVI write video frame"); return(-1); } vid_chunks++; vid_ms = vid_chunks*1000.0/fps; for(j=0; j<aud_tracks; ++j) { if (j == out_track_num) continue; AVI_set_audio_track(avifile1, j); AVI_set_audio_track(avifile, j); chan = AVI_audio_channels(avifile1); if(chan) { sync_audio_video_avi2avi(vid_ms, &aud_ms_w[j], avifile1, avifile); } } // merge additional track if(headlen>4 && !aud_error) { while (aud_ms < vid_ms) { //printf("reading Audio Chunk ch(%ld) vms(%lf) ams(%lf)\n", vid_chunks, vid_ms, aud_ms); pos = ftell(f); len = fread (head, 1, 8, f); if (len<=0) { //eof fprintf(stderr, "EOF in %s; continuing ..\n", audfile); aud_error=1; break; } if ( (headlen = tc_get_audio_header(head, len, format_add, NULL, NULL, &mp3rate_i))<0) { fprintf(stderr, "Broken %s track #(%d)? skipping\n", (format_add==0x55?"MP3":"AC3"), aud_tracks); aud_ms = vid_ms; aud_error=1; } else { // look in import/tcscan.c for explanation aud_ms += (headlen*8.0)/(mp3rate_i); } fseek (f, pos, SEEK_SET); len = fread (data, headlen, 1, f); if (len<=0) { //eof fprintf(stderr, "EOF in %s; continuing ..\n", audfile); aud_error=1; break; } AVI_set_audio_track(avifile, out_track_num); if(AVI_write_audio(avifile, data, headlen)<0) { AVI_print_error("AVI write audio frame"); return(-1); } } } // progress fprintf(stderr, "[%s] (%06ld-%06ld)\r", outfile, offset, offset + n); } fprintf(stderr,"\n"); offset = frames; // more files? while (optind < argc) { printf ("file %02d %s\n", ++cc, argv[optind]); if(NULL == ( avifile1 = AVI_open_input_file(argv[optind++],1))) { AVI_print_error("AVI open"); goto finish; } AVI_seek_start(avifile1); frames = AVI_video_frames(avifile1); for (n=0; n<frames; ++n) { // video bytes = AVI_read_frame(avifile1, data, &key); if(bytes < 0) { AVI_print_error("AVI read video frame"); return(-1); } if(AVI_write_frame(avifile, data, bytes, key)<0) { AVI_print_error("AVI write video frame"); return(-1); } vid_chunks++; vid_ms = vid_chunks*1000.0/fps; for(j=0; j<aud_tracks; ++j) { if (j == out_track_num) continue; AVI_set_audio_track(avifile1, j); AVI_set_audio_track(avifile, j); chan = AVI_audio_channels(avifile1); if(chan) { sync_audio_video_avi2avi(vid_ms, &aud_ms_w[j], avifile1, avifile); } } // merge additional track // audio if(headlen>4 && !aud_error) { while (aud_ms < vid_ms) { //printf("reading Audio Chunk ch(%ld) vms(%lf) ams(%lf)\n", vid_chunks, vid_ms, aud_ms); pos = ftell(f); len = fread (head, 8, 1, f); if (len<=0) { //eof fprintf(stderr, "EOF in %s; continuing ..\n", audfile); aud_error=1; break; } if ( (headlen = tc_get_audio_header(head, len, format_add, NULL, NULL, &mp3rate_i))<0) { fprintf(stderr, "Broken %s track #(%d)?\n", (format_add==0x55?"MP3":"AC3"), aud_tracks); aud_ms = vid_ms; aud_error=1; } else { // look in import/tcscan.c for explanation aud_ms += (headlen*8.0)/(mp3rate_i); } fseek (f, pos, SEEK_SET); len = fread (data, headlen, 1, f); if (len<=0) { //eof fprintf(stderr, "EOF in %s; continuing ..\n", audfile); aud_error=1; break; } AVI_set_audio_track(avifile, out_track_num); if(AVI_write_audio(avifile, data, headlen)<0) { AVI_print_error("AVI write audio frame"); return(-1); } } } // progress fprintf(stderr, "[%s] (%06ld-%06ld)\r", outfile, offset, offset + n); } fprintf(stderr, "\n"); offset += frames; AVI_close(avifile1); } if (f) fclose(f); printf("... done multiplexing in %s\n", outfile); AVI_close(avifile); return(0); }
int main(int argc, char *argv[]) { info_t ipipe; int ch, n, user = 0, demux_mode = TC_DEMUX_SEQ_ADJUST; int npass = 0, *pass = NULL, *new_pass = NULL; int keep_initial_seq = 0, hard_fps_flag = 0, pack_sl = PACKAGE_ALL; int unit_seek = 0, resync_seq1 = 0, resync_seq2 = INT_MAX; int a_track = 0, v_track = 0, subid = 0x80; double fps = PAL_FPS; long stream_stype = TC_STYPE_UNKNOWN; long stream_codec = TC_CODEC_UNKNOWN; long stream_magic = TC_MAGIC_UNKNOWN; long x; char *magic = "", *codec = NULL, *name = NULL; char *logfile = SYNC_LOGFILE, *str = NULL, *end = NULL; //defaults: //proper initialization memset(&ipipe, 0, sizeof(info_t)); libtc_init(&argc, &argv); while ((ch = getopt(argc, argv, "A:a:d:x:i:vt:S:M:f:P:WHs:O?h")) != -1) { switch (ch) { case 'i': if (optarg[0] == '-') usage(EXIT_FAILURE); name = optarg; break; case 'O': keep_initial_seq = 1; break; case 'P': if (optarg[0] == '-') usage(EXIT_FAILURE); logfile = optarg; break; case 'S': if (optarg[0] == '-') usage(EXIT_FAILURE); n = sscanf(optarg,"%d,%d-%d", &unit_seek, &resync_seq1, &resync_seq2); if (n < 0) { tc_log_error(EXE, "invalid parameter for option -S"); usage(EXIT_FAILURE); } if (unit_seek < 0) { tc_log_error(EXE, "invalid unit parameter for option -S"); usage(EXIT_FAILURE); } if (resync_seq1 < 0 || resync_seq2 < 0 || resync_seq1 >= resync_seq2) { tc_log_error(EXE, "invalid sequence parameter for option -S"); usage(EXIT_FAILURE); } break; case 'd': if (optarg[0] == '-') usage(EXIT_FAILURE); verbose = atoi(optarg); break; case 'f': if (optarg[0] == '-') usage(EXIT_FAILURE); fps = atof(optarg); break; case 'W': demux_mode = TC_DEMUX_SEQ_LIST; logfile = NULL; break; case 'H': hard_fps_flag = 1; break; case 'x': if (optarg[0] == '-') usage(EXIT_FAILURE); codec = optarg; if (strcmp(codec,"ac3") == 0) { pack_sl = PACKAGE_AUDIO_AC3; stream_codec = TC_CODEC_AC3; } if (strcmp(codec,"mpeg2") == 0) { pack_sl = PACKAGE_VIDEO; stream_codec = TC_CODEC_MPEG2; } if (strcmp(codec,"mp3") == 0) { pack_sl = PACKAGE_AUDIO_MP3; stream_codec = TC_CODEC_MP3; } if (strcmp(codec,"pcm") == 0) { pack_sl = PACKAGE_AUDIO_PCM; stream_codec = TC_CODEC_PCM; } if (strcmp(codec,"ps1") == 0) { pack_sl = PACKAGE_SUBTITLE; stream_codec = TC_CODEC_SUB; } break; case 't': if (optarg[0] == '-') usage(EXIT_FAILURE); magic = optarg; user = 1; break; case 's': if (optarg[0] == '-') usage(EXIT_FAILURE); subid = strtol(optarg, NULL, 16); break; case 'A': if (optarg[0] == '-') usage(EXIT_FAILURE); while (1) { x = strtol(str, &end, 0); if ((end == str) || (x < 1) || (x > 0xff)) { tc_log_error(EXE, "invalid parameter for option -A"); exit(1); } if (*end == '\0') { break; } if (*end != ',') { tc_log_error(EXE, "invalid parameter for option -A"); exit(1); } str = end + 1; new_pass = realloc(pass, (npass + 1) * sizeof (int)); if (new_pass == NULL) { tc_log_error(EXE, "out of memory"); exit(1); } pass = new_pass; pass[npass++] = (int)x; } break; case 'M': if (optarg[0] == '-') usage(EXIT_FAILURE); demux_mode = atoi(optarg); if (demux_mode == TC_DEMUX_OFF) verbose = TC_QUIET; if (demux_mode < 0 || demux_mode > TC_DEMUX_MAX_OPTS) { tc_log_error(EXE, "invalid parameter for option -M"); exit(1); } break; case 'a': if (optarg[0] == '-') usage(EXIT_FAILURE); if ((n = sscanf(optarg,"%d,%d", &a_track, &v_track)) <= 0) { tc_log_error(EXE, "invalid parameter for option -a"); exit(1); } break; case 'v': version(); exit(0); break; case 'h': usage(EXIT_SUCCESS); default: usage(EXIT_FAILURE); } } ac_init(AC_ALL); /* ------------------------------------------------------------ * fill out defaults for info structure * ------------------------------------------------------------*/ // assume defaults if (name == NULL) stream_stype=TC_STYPE_STDIN; // no autodetection yet if (argc == 1) { usage(EXIT_FAILURE); } // do not try to mess with the stream if (stream_stype == TC_STYPE_STDIN) { ipipe.fd_in = STDIN_FILENO; } else { if (tc_file_check(name)) exit(1); ipipe.fd_in = xio_open(name, O_RDONLY); if (ipipe.fd_in < 0) { tc_log_perror(EXE, "open file"); exit(1); } // try to find out the filetype stream_magic = fileinfo(ipipe.fd_in, 0); if (verbose) tc_log_msg(EXE, "(pid=%d) %s", getpid(), filetype(stream_magic)); } // fill out defaults for info structure ipipe.fd_out = STDOUT_FILENO; ipipe.magic = stream_magic; ipipe.stype = stream_stype; ipipe.codec = stream_codec; ipipe.verbose = verbose; ipipe.ps_unit = unit_seek; ipipe.ps_seq1 = resync_seq1; ipipe.ps_seq2 = resync_seq2; ipipe.demux = demux_mode; ipipe.select = pack_sl; ipipe.keep_seq = keep_initial_seq; ipipe.subid = subid; ipipe.fps = fps; ipipe.hard_fps_flag = hard_fps_flag; ipipe.track = a_track; ipipe.name = logfile; //FIXME: video defaults to 0 /* ------------------------------------------------------------ * main processing mode * ------------------------------------------------------------*/ if (npass > 0) tcdemux_pass_through(&ipipe, pass, npass); else tcdemux_thread(&ipipe); return 0; }
int main(int argc, char *argv[]) { info_t ipipe; int user=0; long stream_stype = TC_STYPE_UNKNOWN, stream_magic = TC_MAGIC_UNKNOWN, stream_codec = TC_CODEC_UNKNOWN; int ch, done=0, track=0; char *magic=NULL, *codec=NULL, *name=NULL; //proper initialization memset(&ipipe, 0, sizeof(info_t)); ipipe.frame_limit[0]=0; ipipe.frame_limit[1]=LONG_MAX; libtc_init(&argc, &argv); while ((ch = getopt(argc, argv, "d:x:i:f:a:vt:C:?h")) != -1) { switch (ch) { case 'i': if(optarg[0]=='-') usage(EXIT_FAILURE); name = optarg; break; case 'd': if(optarg[0]=='-') usage(EXIT_FAILURE); verbose = atoi(optarg); break; case 'x': if(optarg[0]=='-') usage(EXIT_FAILURE); codec = optarg; break; case 'f': if(optarg[0]=='-') usage(EXIT_FAILURE); ipipe.nav_seek_file = optarg; break; case 't': if(optarg[0]=='-') usage(EXIT_FAILURE); magic = optarg; user=1; break; case 'a': if(optarg[0]=='-') usage(EXIT_FAILURE); track = strtol(optarg, NULL, 0); break; case 'C': if(optarg[0]=='-') usage(EXIT_FAILURE); if (2 != sscanf(optarg,"%ld-%ld", &ipipe.frame_limit[0], &ipipe.frame_limit[1])) usage(EXIT_FAILURE); if (ipipe.frame_limit[0] > ipipe.frame_limit[1]) { tc_log_error(EXE, "Invalid -C options"); usage(EXIT_FAILURE); } break; case 'v': version(); exit(0); break; case 'h': usage(EXIT_SUCCESS); default: usage(EXIT_FAILURE); } } ac_init(AC_ALL); /* ------------------------------------------------------------ * * fill out defaults for info structure * * ------------------------------------------------------------*/ // assume defaults if(name==NULL) stream_stype=TC_STYPE_STDIN; // no autodetection yet if(codec==NULL && magic==NULL) { tc_log_error(EXE, "invalid codec %s", codec); usage(EXIT_FAILURE); } if(codec==NULL) codec=""; // do not try to mess with the stream if(stream_stype!=TC_STYPE_STDIN) { if(tc_file_check(name)) exit(1); if((ipipe.fd_in = xio_open(name, O_RDONLY))<0) { tc_log_perror(EXE, "file open"); return(-1); } stream_magic = fileinfo(ipipe.fd_in, 0); if(verbose & TC_DEBUG) tc_log_msg(EXE, "(pid=%d) %s", getpid(), filetype(stream_magic)); } else ipipe.fd_in = STDIN_FILENO; if(verbose & TC_DEBUG) tc_log_msg(EXE, "(pid=%d) starting, doing %s", getpid(), codec); // fill out defaults for info structure ipipe.fd_out = STDOUT_FILENO; ipipe.magic = stream_magic; ipipe.stype = stream_stype; ipipe.codec = stream_codec; ipipe.track = track; ipipe.select = TC_VIDEO; ipipe.verbose = verbose; ipipe.name = name; /* ------------------------------------------------------------ * * codec specific section * * note: user provided magic values overwrite autodetection! * * ------------------------------------------------------------*/ if(magic==NULL) magic=""; // OGM if (ipipe.magic == TC_MAGIC_OGG) { // dummy for video if(strcmp(codec, "raw")==0) ipipe.codec = TC_CODEC_RGB24; if((strcmp(codec, "vorbis")==0) || (strcmp(codec, "ogg")==0)) { ipipe.codec = TC_CODEC_VORBIS; ipipe.select = TC_AUDIO; } if(strcmp(codec, "mp3")==0) { ipipe.codec = TC_CODEC_MP3; ipipe.select = TC_AUDIO; } if(strcmp(codec, "pcm")==0) { ipipe.codec = TC_CODEC_PCM; ipipe.select = TC_AUDIO; } extract_ogm(&ipipe); done = 1; } // MPEG2 if(strcmp(codec,"mpeg2")==0) { ipipe.codec = TC_CODEC_MPEG2; if(strcmp(magic, "vob")==0) ipipe.magic = TC_MAGIC_VOB; if(strcmp(magic, "m2v")==0) ipipe.magic = TC_MAGIC_M2V; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; extract_mpeg2(&ipipe); done = 1; } // PCM if(strcmp(codec,"pcm")==0) { ipipe.codec = TC_CODEC_PCM; ipipe.select = TC_AUDIO; if(strcmp(magic, "vob")==0) ipipe.magic = TC_MAGIC_VOB; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "wav")==0) ipipe.magic = TC_MAGIC_WAV; extract_pcm(&ipipe); done = 1; } // SUBTITLE (private_stream_1) if(strcmp(codec,"ps1")==0) { ipipe.codec = TC_CODEC_PS1; ipipe.select = TC_AUDIO; if(strcmp(magic, "vob")==0) ipipe.magic = TC_MAGIC_VOB; if(strcmp(magic, "vdr")==0) ipipe.magic = TC_MAGIC_VDR; extract_ac3(&ipipe); done = 1; } // DV if(strcmp(codec,"dv")==0) { ipipe.codec = TC_CODEC_DV; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; extract_dv(&ipipe); done = 1; } // RGB if(strcmp(codec,"rgb")==0) { ipipe.codec = TC_CODEC_RGB24; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "wav")==0) ipipe.magic = TC_MAGIC_WAV; extract_rgb(&ipipe); done = 1; } // DTS if(strcmp(codec,"dts")==0) { ipipe.codec = TC_CODEC_DTS; ipipe.select = TC_AUDIO; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "vob")==0) ipipe.magic = TC_MAGIC_VOB; extract_ac3(&ipipe); done = 1; } // AC3 if(strcmp(codec,"ac3")==0) { ipipe.codec = TC_CODEC_AC3; ipipe.select = TC_AUDIO; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "vob")==0) ipipe.magic = TC_MAGIC_VOB; extract_ac3(&ipipe); done = 1; } // MP3 if(strcmp(codec,"mp3")==0 || strcmp(codec,"mp2")==0) { ipipe.codec = TC_CODEC_MP3; ipipe.select = TC_AUDIO; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "vob")==0) ipipe.magic = TC_MAGIC_VOB; extract_mp3(&ipipe); done = 1; } // YUV420P if(strcmp(codec,"yuv420p")==0) { ipipe.codec = TC_CODEC_YUV420P; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "yuv4mpeg")==0) ipipe.magic = TC_MAGIC_YUV4MPEG; extract_yuv(&ipipe); done = 1; } // YUV422P if(strcmp(codec,"yuv422p")==0) { ipipe.codec = TC_CODEC_YUV422P; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; if(strcmp(magic, "yuv4mpeg")==0) ipipe.magic = TC_MAGIC_YUV4MPEG; extract_yuv(&ipipe); done = 1; } // UYVY if(strcmp(codec,"uyvy")==0) { ipipe.codec = TC_CODEC_UYVY; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; extract_yuv(&ipipe); done = 1; } // LZO if(strcmp(codec,"lzo")==0) { ipipe.codec = TC_CODEC_YUV420P; if(strcmp(magic, "avi")==0) ipipe.magic = TC_MAGIC_AVI; if(strcmp(magic, "raw")==0) ipipe.magic = TC_MAGIC_RAW; extract_lzo(&ipipe); done = 1; } // AVI extraction //need to check if there isn't a codec from the input option (if we have a file with TC_MAGIC_AVI and we specify -x pcm we have pcm and rgb output) if ((strcmp(magic, "avi")==0 || ipipe.magic==TC_MAGIC_AVI)&& (codec == NULL)) { ipipe.magic=TC_MAGIC_AVI; extract_avi(&ipipe); done = 1; } if (strcmp(codec, "raw")==0 || strcmp(codec, "video")==0) { ipipe.select=TC_VIDEO-1; ipipe.magic=TC_MAGIC_AVI; extract_avi(&ipipe); done = 1; } if(!done) { tc_log_error(EXE, "(pid=%d) unable to handle codec %s", getpid(), codec); exit(1); } if(ipipe.fd_in != STDIN_FILENO) xio_close(ipipe.fd_in); return(0); }