annotate libmpdemux/demux_lavf.c @ 14217:5b5ebf93ec16

Adds support for LADSPA (Linux Audio Developer's Simple Plugin API) plugins. Compilation is optional and can be controled by configure. You need to have the LADSPA SDK installed in order to have it autodetected by configure. Manual page is updated.
author ivo
date Thu, 23 Dec 2004 02:09:52 +0000
parents dd7199cfb8e4
children 0c4a7d871288
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
1 /*
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
2 Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
3
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
6 the Free Software Foundation; either version 2 of the License, or
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
7 (at your option) any later version.
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
8
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
12 GNU General Public License for more details.
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
13
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
15 along with this program; if not, write to the Free Software
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
17 */
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
18
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
19 // #include <stdio.h>
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
20 #include <stdlib.h>
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
21 // #include <unistd.h>
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
22
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
23 #include "config.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
24 #include "mp_msg.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
25 // #include "help_mp.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
26
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
27 #include "stream.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
28 #include "demuxer.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
29 #include "stheader.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
30
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
31 #ifdef USE_LIBAVFORMAT
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
32
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
33 #include "avformat.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
34 #include "avi.h"
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
35
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
36 #define PROBE_BUF_SIZE 2048
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
37
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
38 typedef struct lavf_priv_t{
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
39 AVInputFormat *avif;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
40 AVFormatContext *avfc;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
41 ByteIOContext pb;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
42 int audio_streams;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
43 int video_streams;
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
44 int64_t last_pts;
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
45 }lavf_priv_t;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
46
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
47 extern void print_wave_header(WAVEFORMATEX *h);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
48 extern void print_video_header(BITMAPINFOHEADER *h);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
49
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
50 static int mp_open(URLContext *h, const char *filename, int flags){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
51 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
52 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
53
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
54 static int mp_read(URLContext *h, unsigned char *buf, int size){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
55 stream_t *stream = (stream_t*)h->priv_data;
12165
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
56 int ret;
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
57
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
58 if(stream_eof(stream)) //needed?
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
59 return -1;
12165
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
60 ret=stream_read(stream, buf, size);
12166
cceadb8af60b nicer EOF solution, mpeg-ps works now too
michael
parents: 12165
diff changeset
61
12165
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
62 mp_msg(MSGT_HEADER,MSGL_DBG2,"%d=mp_read(%p, %p, %d), eof:%d\n", ret, h, buf, size, stream->eof);
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
63 return ret;
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
64 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
65
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
66 static int mp_write(URLContext *h, unsigned char *buf, int size){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
67 return -1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
68 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
69
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
70 static offset_t mp_seek(URLContext *h, offset_t pos, int whence){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
71 stream_t *stream = (stream_t*)h->priv_data;
12165
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
72
6ae21c78ed8d libavformat really doesnt like it that the streams get stuck if the end is reached
michael
parents: 12164
diff changeset
73 mp_msg(MSGT_HEADER,MSGL_DBG2,"mp_seek(%p, %d, %d)\n", h, (int)pos, whence);
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
74 if(whence == SEEK_CUR)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
75 pos +=stream_tell(stream);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
76 else if(whence == SEEK_END)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
77 pos += stream->end_pos;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
78 else if(whence != SEEK_SET)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
79 return -1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
80
12167
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
81 if(pos<stream->end_pos && stream->eof)
12166
cceadb8af60b nicer EOF solution, mpeg-ps works now too
michael
parents: 12165
diff changeset
82 stream_reset(stream);
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
83 if(stream_seek(stream, pos)==0)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
84 return -1;
12166
cceadb8af60b nicer EOF solution, mpeg-ps works now too
michael
parents: 12165
diff changeset
85
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
86 return pos;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
87 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
88
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
89 static int mp_close(URLContext *h){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
90 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
91 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
92
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
93 static URLProtocol mp_protocol = {
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
94 "mp",
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
95 mp_open,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
96 mp_read,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
97 mp_write,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
98 mp_seek,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
99 mp_close,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
100 };
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
101
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
102 int lavf_check_file(demuxer_t *demuxer){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
103 AVProbeData avpd;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
104 uint8_t buf[PROBE_BUF_SIZE];
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
105 lavf_priv_t *priv;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
106
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
107 if(!demuxer->priv)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
108 demuxer->priv=calloc(sizeof(lavf_priv_t),1);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
109 priv= demuxer->priv;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
110
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
111 av_register_all();
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
112
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
113 stream_read(demuxer->stream, buf, PROBE_BUF_SIZE);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
114 avpd.filename= demuxer->stream->url;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
115 avpd.buf= buf;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
116 avpd.buf_size= PROBE_BUF_SIZE;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
117
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
118 priv->avif= av_probe_input_format(&avpd, 1);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
119 if(!priv->avif){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
120 mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: no clue about this gibberish!\n");
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
121 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
122 }else
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
123 mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: %s\n", priv->avif->long_name);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
124
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
125 return 1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
126 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
127
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
128 int demux_open_lavf(demuxer_t *demuxer){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
129 AVFormatContext *avfc;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
130 AVFormatParameters ap;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
131 lavf_priv_t *priv= demuxer->priv;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
132 int i;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
133 char mp_filename[256]="mp:";
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
134
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
135 memset(&ap, 0, sizeof(AVFormatParameters));
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
136
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
137 stream_seek(demuxer->stream, 0);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
138
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
139 register_protocol(&mp_protocol);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
140
12463
3a7ef0fbc2f9 segfault fix
michael
parents: 12304
diff changeset
141 if(demuxer->stream->url)
3a7ef0fbc2f9 segfault fix
michael
parents: 12304
diff changeset
142 strncpy(mp_filename + 3, demuxer->stream->url, sizeof(mp_filename)-3);
3a7ef0fbc2f9 segfault fix
michael
parents: 12304
diff changeset
143 else
3a7ef0fbc2f9 segfault fix
michael
parents: 12304
diff changeset
144 strncpy(mp_filename + 3, "foobar.dummy", sizeof(mp_filename)-3);
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
145
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
146 url_fopen(&priv->pb, mp_filename, URL_RDONLY);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
147
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
148 ((URLContext*)(priv->pb.opaque))->priv_data= demuxer->stream;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
149
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
150 if(av_open_input_stream(&avfc, &priv->pb, mp_filename, priv->avif, &ap)<0){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
151 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n");
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
152 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
153 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
154
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
155 priv->avfc= avfc;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
156
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
157 if(av_find_stream_info(avfc) < 0){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
158 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_find_stream_info() failed\n");
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
159 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
160 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
161
12167
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
162 if(avfc->title [0]) demux_info_add(demuxer, "name" , avfc->title );
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
163 if(avfc->author [0]) demux_info_add(demuxer, "author" , avfc->author );
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
164 if(avfc->copyright[0]) demux_info_add(demuxer, "copyright", avfc->copyright);
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
165 if(avfc->comment [0]) demux_info_add(demuxer, "comments" , avfc->comment );
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
166 if(avfc->album [0]) demux_info_add(demuxer, "album" , avfc->album );
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
167 // if(avfc->year ) demux_info_add(demuxer, "year" , avfc->year );
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
168 // if(avfc->track ) demux_info_add(demuxer, "track" , avfc->track );
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
169 if(avfc->genre [0]) demux_info_add(demuxer, "genre" , avfc->genre );
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
170
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
171 for(i=0; i<avfc->nb_streams; i++){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
172 AVStream *st= avfc->streams[i];
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
173 AVCodecContext *codec= &st->codec;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
174
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
175 switch(codec->codec_type){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
176 case CODEC_TYPE_AUDIO:{
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
177 WAVEFORMATEX *wf= calloc(sizeof(WAVEFORMATEX) + codec->extradata_size, 1);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
178 sh_audio_t* sh_audio=new_sh_audio(demuxer, i);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
179 priv->audio_streams++;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
180 if(!codec->codec_tag)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
181 codec->codec_tag= codec_get_wav_tag(codec->codec_id);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
182 wf->wFormatTag= codec->codec_tag;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
183 wf->nChannels= codec->channels;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
184 wf->nSamplesPerSec= codec->sample_rate;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
185 wf->nAvgBytesPerSec= codec->bit_rate/8;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
186 wf->nBlockAlign= codec->block_align;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
187 wf->wBitsPerSample= codec->bits_per_sample;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
188 wf->cbSize= codec->extradata_size;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
189 if(codec->extradata_size){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
190 memcpy(
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
191 wf + 1,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
192 codec->extradata,
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
193 codec->extradata_size);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
194 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
195 sh_audio->wf= wf;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
196 sh_audio->ds= demuxer->audio;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
197 sh_audio->format= codec->codec_tag;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
198 sh_audio->channels= codec->channels;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
199 sh_audio->samplerate= codec->sample_rate;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
200 if(verbose>=1) print_wave_header(sh_audio->wf);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
201 demuxer->audio->id=i;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
202 demuxer->audio->sh= demuxer->a_streams[i];
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
203 break;}
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
204 case CODEC_TYPE_VIDEO:{
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
205 BITMAPINFOHEADER *bih=calloc(sizeof(BITMAPINFOHEADER) + codec->extradata_size,1);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
206 sh_video_t* sh_video=new_sh_video(demuxer, i);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
207
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
208 priv->video_streams++;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
209 if(!codec->codec_tag)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
210 codec->codec_tag= codec_get_bmp_tag(codec->codec_id);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
211 bih->biSize= sizeof(BITMAPINFOHEADER) + codec->extradata_size;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
212 bih->biWidth= codec->width;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
213 bih->biHeight= codec->height;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
214 bih->biBitCount= codec->bits_per_sample;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
215 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
216 bih->biCompression= codec->codec_tag;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
217 sh_video->bih= bih;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
218 sh_video->disp_w= codec->width;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
219 sh_video->disp_h= codec->height;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
220 sh_video->video.dwRate= codec->frame_rate;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
221 sh_video->video.dwScale= codec->frame_rate_base;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
222 sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
223 sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
224 sh_video->format = bih->biCompression;
12167
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
225 sh_video->aspect= codec->width * codec->sample_aspect_ratio.num
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
226 / (float)(codec->height * codec->sample_aspect_ratio.den);
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
227 mp_msg(MSGT_DEMUX,MSGL_DBG2,"aspect= %d*%d/(%d*%d)\n",
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
228 codec->width, codec->sample_aspect_ratio.num,
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
229 codec->height, codec->sample_aspect_ratio.den);
6421ebfc0018 avoid unneeded stream_reset()
michael
parents: 12166
diff changeset
230
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
231 sh_video->ds= demuxer->video;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
232 if(codec->extradata_size)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
233 memcpy(sh_video->bih + 1, codec->extradata, codec->extradata_size);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
234 if(verbose>=1) print_video_header(sh_video->bih);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
235 /* short biPlanes;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
236 int biXPelsPerMeter;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
237 int biYPelsPerMeter;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
238 int biClrUsed;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
239 int biClrImportant;*/
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
240 demuxer->video->id=i;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
241 demuxer->video->sh= demuxer->v_streams[i];
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
242 break;}
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
243 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
244 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
245
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
246 mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams);
13749
dd7199cfb8e4 print build num
michael
parents: 13747
diff changeset
247 mp_msg(MSGT_HEADER,MSGL_V,"LAVF: build %d\n", LIBAVFORMAT_BUILD);
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
248 if(!priv->audio_streams) demuxer->audio->id=-2; // nosound
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
249 // else if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
250 if(!priv->video_streams){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
251 if(!priv->audio_streams){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
252 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF: no audio or video headers found - broken file?\n");
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
253 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
254 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
255 demuxer->video->id=-2; // audio-only
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
256 } //else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
257
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
258 return 1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
259 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
260
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
261 int demux_lavf_fill_buffer(demuxer_t *demux){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
262 lavf_priv_t *priv= demux->priv;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
263 AVPacket pkt;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
264 demux_packet_t *dp;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
265 demux_stream_t *ds;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
266 int id;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
267 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_lavf_fill_buffer()\n");
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
268
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
269 demux->filepos=stream_tell(demux->stream);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
270
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
271 if(stream_eof(demux->stream)){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
272 // demuxre->stream->eof=1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
273 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
274 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
275
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
276 if(av_read_frame(priv->avfc, &pkt) < 0)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
277 return 0;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
278
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
279 id= pkt.stream_index;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
280
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
281 if(id==demux->audio->id){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
282 // audio
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
283 ds=demux->audio;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
284 if(!ds->sh){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
285 ds->sh=demux->a_streams[id];
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
286 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF audio ID = %d\n",ds->id);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
287 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
288 } else if(id==demux->video->id){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
289 // video
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
290 ds=demux->video;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
291 if(!ds->sh){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
292 ds->sh=demux->v_streams[id];
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
293 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF video ID = %d\n",ds->id);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
294 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
295 } else
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
296 ds= NULL;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
297
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
298 if(0/*pkt.destruct == av_destruct_packet*/){
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
299 //ok kids, dont try this at home :)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
300 dp=(demux_packet_t*)malloc(sizeof(demux_packet_t));
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
301 dp->len=pkt.size;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
302 dp->next=NULL;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
303 dp->refcount=1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
304 dp->master=NULL;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
305 dp->buffer=pkt.data;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
306 pkt.destruct= NULL;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
307 }else{
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
308 dp=new_demux_packet(pkt.size);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
309 memcpy(dp->buffer, pkt.data, pkt.size);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
310 av_free_packet(&pkt);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
311 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
312
13747
1bdec8201f77 10l (mplayer doesnt like AV_NOPTS_VALUE)
michael
parents: 13607
diff changeset
313 if(pkt.pts != AV_NOPTS_VALUE){
1bdec8201f77 10l (mplayer doesnt like AV_NOPTS_VALUE)
michael
parents: 13607
diff changeset
314 priv->last_pts= pkt.pts;
1bdec8201f77 10l (mplayer doesnt like AV_NOPTS_VALUE)
michael
parents: 13607
diff changeset
315 dp->pts=pkt.pts / (float)AV_TIME_BASE;
1bdec8201f77 10l (mplayer doesnt like AV_NOPTS_VALUE)
michael
parents: 13607
diff changeset
316 }
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
317 dp->pos=demux->filepos;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
318 dp->flags= !!(pkt.flags&PKT_FLAG_KEY);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
319 // append packet to DS stream:
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
320 ds_add_packet(ds,dp);
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
321 return 1;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
322 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
323
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
324 void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags){
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
325 lavf_priv_t *priv = demuxer->priv;
44f33fb19acf seeking
michael
parents: 12167
diff changeset
326 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %d)\n", demuxer, rel_seek_secs, flags);
44f33fb19acf seeking
michael
parents: 12167
diff changeset
327
13607
3d262519187b LIBAVFORMAT_BUILD >= 4619
michael
parents: 12463
diff changeset
328 #if LIBAVFORMAT_BUILD < 4619
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
329 av_seek_frame(priv->avfc, -1, priv->last_pts + rel_seek_secs*AV_TIME_BASE);
13607
3d262519187b LIBAVFORMAT_BUILD >= 4619
michael
parents: 12463
diff changeset
330 #else
3d262519187b LIBAVFORMAT_BUILD >= 4619
michael
parents: 12463
diff changeset
331 av_seek_frame(priv->avfc, -1, priv->last_pts + rel_seek_secs*AV_TIME_BASE, rel_seek_secs < 0 ? AVSEEK_FLAG_BACKWARD : 0);
3d262519187b LIBAVFORMAT_BUILD >= 4619
michael
parents: 12463
diff changeset
332 #endif
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
333 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
334
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
335 int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
336 {
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
337 lavf_priv_t *priv = demuxer->priv;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
338
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
339 switch (cmd) {
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
340 case DEMUXER_CTRL_GET_TIME_LENGTH:
44f33fb19acf seeking
michael
parents: 12167
diff changeset
341 if (priv->avfc->duration == 0)
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
342 return DEMUXER_CTRL_DONTKNOW;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
343
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
344 *((unsigned long *)arg) = priv->avfc->duration / AV_TIME_BASE;
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
345 return DEMUXER_CTRL_OK;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
346
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
347 case DEMUXER_CTRL_GET_PERCENT_POS:
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
348 if (priv->avfc->duration == 0)
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
349 return DEMUXER_CTRL_DONTKNOW;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
350
12168
44f33fb19acf seeking
michael
parents: 12167
diff changeset
351 *((int *)arg) = (int)(priv->last_pts*100 / priv->avfc->duration);
44f33fb19acf seeking
michael
parents: 12167
diff changeset
352 return DEMUXER_CTRL_OK;
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
353
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
354 default:
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
355 return DEMUXER_CTRL_NOTIMPL;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
356 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
357 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
358
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
359 void demux_close_lavf(demuxer_t *demuxer)
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
360 {
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
361 lavf_priv_t* priv = demuxer->priv;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
362 if (priv){
12304
434242b0706c fix possible segfault on lavf demuxer patch by (adland <adland123 at yahoo dot com>)
michael
parents: 12168
diff changeset
363 if(priv->avfc)
434242b0706c fix possible segfault on lavf demuxer patch by (adland <adland123 at yahoo dot com>)
michael
parents: 12168
diff changeset
364 {
434242b0706c fix possible segfault on lavf demuxer patch by (adland <adland123 at yahoo dot com>)
michael
parents: 12168
diff changeset
365 av_close_input_file(priv->avfc); priv->avfc= NULL;
434242b0706c fix possible segfault on lavf demuxer patch by (adland <adland123 at yahoo dot com>)
michael
parents: 12168
diff changeset
366 }
12164
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
367 free(priv); demuxer->priv= NULL;
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
368 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
369 }
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
370
77ff303c0eaa demux_lavf
michael
parents:
diff changeset
371 #endif // USE_LIBAVFORMAT