1 /*
2  *  extract_avi.c
3  *
4  *  Copyright (C) Thomas Oestreich - June 2001
5  *
6  *  This file is part of transcode, a video stream processing tool
7  *
8  *  transcode is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2, or (at your option)
11  *  any later version.
12  *
13  *  transcode is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with GNU Make; see the file COPYING.  If not, write to
20  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  */
23 
24 #include "transcode.h"
25 #include "tcinfo.h"
26 
27 #include "libtc/libtc.h"
28 #include "libtc/ratiocodes.h"
29 #include "ioaux.h"
30 #include "avilib/avilib.h"
31 #include "tc.h"
32 
33 /* ------------------------------------------------------------
34  *
35  * avi extract thread
36  *
37  * ------------------------------------------------------------*/
38 
extract_avi(info_t * ipipe)39 void extract_avi(info_t *ipipe)
40 {
41   // seek to vob_offset?
42   AVI_dump(ipipe->name, ipipe->select);
43 }
44 
probe_avi(info_t * ipipe)45 void probe_avi(info_t *ipipe)
46 {
47     avi_t *avifile=NULL;
48     char *codec=NULL;
49     int j, tracks;
50 
51     // scan file
52     if (ipipe->nav_seek_file) {
53 	if(NULL == (avifile = AVI_open_indexfd(ipipe->fd_in,0,ipipe->nav_seek_file))) {
54 	    AVI_print_error("AVI open");
55 	    return;
56 	}
57     } else {
58 	if(NULL == (avifile = AVI_open_fd(ipipe->fd_in,1))) {
59 	    AVI_print_error("AVI open");
60 	    return;
61 	}
62     }
63 
64     ipipe->probe_info->frames = AVI_video_frames(avifile);
65 
66     ipipe->probe_info->width  =  AVI_video_width(avifile);
67     ipipe->probe_info->height =  AVI_video_height(avifile);
68     ipipe->probe_info->fps    =  AVI_frame_rate(avifile);
69 
70     tracks = AVI_audio_tracks(avifile);
71 
72     //FIXME: check for max tracks suported
73 
74     for(j=0; j<tracks; ++j) {
75 
76       AVI_set_audio_track(avifile, j);
77 
78       ipipe->probe_info->track[j].samplerate = AVI_audio_rate(avifile);
79       ipipe->probe_info->track[j].chan = AVI_audio_channels(avifile);
80       ipipe->probe_info->track[j].bits = AVI_audio_bits(avifile);
81       ipipe->probe_info->track[j].format = AVI_audio_format(avifile);
82       ipipe->probe_info->track[j].bitrate = AVI_audio_mp3rate(avifile);
83       ipipe->probe_info->track[j].padrate = AVI_audio_padrate(avifile);
84 
85       ipipe->probe_info->track[j].tid=j;
86 
87       if(ipipe->probe_info->track[j].chan>0) ++ipipe->probe_info->num_tracks;
88     }
89 
90     codec = AVI_video_compressor(avifile);
91 
92     //check for supported codecs
93 
94     if(codec!=NULL) {
95 
96       if(strlen(codec)==0) {
97 	ipipe->probe_info->codec=TC_CODEC_RGB;
98       } else {
99 
100 	if(strcasecmp(codec,"dvsd")==0)
101 	  ipipe->probe_info->codec=TC_CODEC_DV;
102 
103 	if(strcasecmp(codec,"UYVY")==0)
104 	  ipipe->probe_info->codec=TC_CODEC_UYVY;
105 
106 	if(strcasecmp(codec,"DIV3")==0)
107 	  ipipe->probe_info->codec=TC_CODEC_DIVX3;
108 
109 	if(strcasecmp(codec,"MP42")==0)
110 	  ipipe->probe_info->codec=TC_CODEC_MP42;
111 
112 	if(strcasecmp(codec,"MP43")==0)
113 	  ipipe->probe_info->codec=TC_CODEC_MP43;
114 
115 	if(strcasecmp(codec,"DIVX")==0)
116 	  ipipe->probe_info->codec=TC_CODEC_DIVX4;
117 
118 	if(strcasecmp(codec,"DX50")==0)
119 	  ipipe->probe_info->codec=TC_CODEC_DIVX5;
120 
121 	if(strcasecmp(codec,"XVID")==0)
122 	  ipipe->probe_info->codec=TC_CODEC_XVID;
123 
124 	if(strcasecmp(codec,"MJPG")==0)
125 	  ipipe->probe_info->codec=TC_CODEC_MJPEG;
126 
127 	if(strcasecmp(codec,"RV10")==0)
128 	  ipipe->probe_info->codec=TC_CODEC_RV10;
129 
130 	if(strcasecmp(codec,"MPG1")==0)
131 	  ipipe->probe_info->codec=TC_CODEC_MPEG1VIDEO;
132 
133 	if(strcasecmp(codec,"LZO1")==0)
134 	  ipipe->probe_info->codec=TC_CODEC_LZO1;
135 
136 	if(strcasecmp(codec,"LZO2")==0)
137 	  ipipe->probe_info->codec=TC_CODEC_LZO2;
138 
139 	if(strcasecmp(codec,"FPS1")==0)
140 	  ipipe->probe_info->codec=TC_CODEC_FRAPS;
141 
142 	if(strcasecmp(codec,"ASV1")==0)
143 	  ipipe->probe_info->codec=TC_CODEC_ASV1;
144 
145 	if(strcasecmp(codec,"ASV2")==0)
146 	  ipipe->probe_info->codec=TC_CODEC_ASV2;
147 
148 	if(strcasecmp(codec,"FFV1")==0)
149 	  ipipe->probe_info->codec=TC_CODEC_FFV1;
150 
151 	if(strcasecmp(codec,"H264")==0
152         || strcasecmp(codec,"X264")==0
153         || strcasecmp(codec,"avc1")==0)
154 	  ipipe->probe_info->codec=TC_CODEC_H264;
155 
156       }
157     } else
158       ipipe->probe_info->codec=TC_CODEC_UNKNOWN;
159 
160     ipipe->probe_info->magic=TC_MAGIC_AVI;
161 
162     tc_frc_code_from_value(&(ipipe->probe_info->frc),
163                            ipipe->probe_info->fps);
164 }
165