VP6F has to be flipped for binary decoder.
[mplayer/glamo.git] / libmpdemux / demux_lavf.c
bloba3b73ce531aa3e4f9cf92fada63042c60965bd46
1 /*
2 * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
4 * This file is part of MPlayer.
6 * MPlayer is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * MPlayer is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 // #include <stdio.h>
22 #include <stdlib.h>
23 // #include <unistd.h>
24 #include <limits.h>
26 #include "config.h"
27 #include "mp_msg.h"
28 #include "help_mp.h"
29 #include "av_opts.h"
31 #include "stream/stream.h"
32 #include "demuxer.h"
33 #include "stheader.h"
34 #include "m_option.h"
35 #include "libvo/sub.h"
37 #include "libavformat/avformat.h"
38 #include "libavformat/avio.h"
39 #include "libavutil/avutil.h"
40 #include "libavcodec/opt.h"
42 #include "mp_taglists.h"
44 #define PROBE_BUF_SIZE (32*1024)
46 extern char *audio_lang;
47 extern char *dvdsub_lang;
48 extern int dvdsub_id;
49 static unsigned int opt_probesize = 0;
50 static unsigned int opt_analyzeduration = 0;
51 static char *opt_format;
52 static char *opt_cryptokey;
53 static char *opt_avopt = NULL;
55 const m_option_t lavfdopts_conf[] = {
56 {"probesize", &(opt_probesize), CONF_TYPE_INT, CONF_RANGE, 32, INT_MAX, NULL},
57 {"format", &(opt_format), CONF_TYPE_STRING, 0, 0, 0, NULL},
58 {"analyzeduration", &(opt_analyzeduration), CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL},
59 {"cryptokey", &(opt_cryptokey), CONF_TYPE_STRING, 0, 0, 0, NULL},
60 {"o", &opt_avopt, CONF_TYPE_STRING, 0, 0, 0, NULL},
61 {NULL, NULL, 0, 0, 0, 0, NULL}
64 #define BIO_BUFFER_SIZE 32768
66 typedef struct lavf_priv_t{
67 AVInputFormat *avif;
68 AVFormatContext *avfc;
69 ByteIOContext *pb;
70 uint8_t buffer[FFMAX(BIO_BUFFER_SIZE, PROBE_BUF_SIZE)];
71 int audio_streams;
72 int video_streams;
73 int sub_streams;
74 int64_t last_pts;
75 int astreams[MAX_A_STREAMS];
76 int vstreams[MAX_V_STREAMS];
77 int sstreams[MAX_S_STREAMS];
78 int cur_program;
79 }lavf_priv_t;
81 void print_wave_header(WAVEFORMATEX *h, int verbose_level);
82 void print_video_header(BITMAPINFOHEADER *h, int verbose_level);
84 static int mp_read(void *opaque, uint8_t *buf, int size) {
85 stream_t *stream = opaque;
86 int ret;
88 if(stream_eof(stream)) //needed?
89 return -1;
90 ret=stream_read(stream, buf, size);
92 mp_msg(MSGT_HEADER,MSGL_DBG2,"%d=mp_read(%p, %p, %d), eof:%d\n", ret, stream, buf, size, stream->eof);
93 return ret;
96 static int64_t mp_seek(void *opaque, int64_t pos, int whence) {
97 stream_t *stream = opaque;
98 int64_t current_pos;
99 mp_msg(MSGT_HEADER,MSGL_DBG2,"mp_seek(%p, %d, %d)\n", stream, (int)pos, whence);
100 if(whence == SEEK_CUR)
101 pos +=stream_tell(stream);
102 else if(whence == SEEK_END && stream->end_pos > 0)
103 pos += stream->end_pos;
104 else if(whence == SEEK_SET)
105 pos += stream->start_pos;
106 else if(whence == AVSEEK_SIZE && stream->end_pos > 0)
107 return stream->end_pos - stream->start_pos;
108 else
109 return -1;
111 if(pos<0)
112 return -1;
113 if(pos<stream->end_pos && stream->eof)
114 stream_reset(stream);
115 current_pos = stream_tell(stream);
116 if(stream_seek(stream, pos)==0) {
117 stream_reset(stream);
118 stream_seek(stream, current_pos);
119 return -1;
122 return pos - stream->start_pos;
125 static void list_formats(void) {
126 AVInputFormat *fmt;
127 mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf input formats:\n");
128 for (fmt = first_iformat; fmt; fmt = fmt->next)
129 mp_msg(MSGT_DEMUX, MSGL_INFO, "%15s : %s\n", fmt->name, fmt->long_name);
132 static int lavf_check_file(demuxer_t *demuxer){
133 AVProbeData avpd;
134 lavf_priv_t *priv;
135 int probe_data_size;
137 if(!demuxer->priv)
138 demuxer->priv=calloc(sizeof(lavf_priv_t),1);
139 priv= demuxer->priv;
141 av_register_all();
143 if (opt_format) {
144 if (strcmp(opt_format, "help") == 0) {
145 list_formats();
146 return 0;
148 priv->avif= av_find_input_format(opt_format);
149 if (!priv->avif) {
150 mp_msg(MSGT_DEMUX,MSGL_FATAL,"Unknown lavf format %s\n", opt_format);
151 return 0;
153 mp_msg(MSGT_DEMUX,MSGL_INFO,"Forced lavf %s demuxer\n", priv->avif->long_name);
154 return DEMUXER_TYPE_LAVF;
157 probe_data_size = stream_read(demuxer->stream, priv->buffer, PROBE_BUF_SIZE);
158 if(probe_data_size <= 0)
159 return 0;
160 avpd.filename= demuxer->stream->url;
161 avpd.buf= priv->buffer;
162 avpd.buf_size= probe_data_size;
164 priv->avif= av_probe_input_format(&avpd, 1);
165 if(!priv->avif){
166 mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: no clue about this gibberish!\n");
167 return 0;
168 }else
169 mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: %s\n", priv->avif->long_name);
171 return DEMUXER_TYPE_LAVF;
174 static const char * const preferred_list[] = {
175 "dxa",
176 "flv",
177 "gxf",
178 "nut",
179 "nuv",
180 "mov,mp4,m4a,3gp,3g2,mj2",
181 "mpc",
182 "mpc8",
183 "mxf",
184 "swf",
185 "vqf",
186 "w64",
187 "wv",
188 NULL
191 static int lavf_check_preferred_file(demuxer_t *demuxer){
192 if (lavf_check_file(demuxer)) {
193 const char * const *p = preferred_list;
194 lavf_priv_t *priv = demuxer->priv;
195 while (*p) {
196 if (strcmp(*p, priv->avif->name) == 0)
197 return DEMUXER_TYPE_LAVF_PREFERRED;
198 p++;
201 return 0;
204 static uint8_t char2int(char c) {
205 if (c >= '0' && c <= '9') return c - '0';
206 if (c >= 'a' && c <= 'f') return c - 'a' + 10;
207 if (c >= 'A' && c <= 'F') return c - 'A' + 10;
208 return 0;
211 static void parse_cryptokey(AVFormatContext *avfc, const char *str) {
212 int len = strlen(str) / 2;
213 uint8_t *key = av_mallocz(len);
214 int i;
215 avfc->keylen = len;
216 avfc->key = key;
217 for (i = 0; i < len; i++, str += 2)
218 *key++ = (char2int(str[0]) << 4) | char2int(str[1]);
221 static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) {
222 lavf_priv_t *priv= demuxer->priv;
223 AVStream *st= avfc->streams[i];
224 AVCodecContext *codec= st->codec;
225 AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0);
226 int g, override_tag = av_codec_get_tag(mp_codecid_override_taglists,
227 codec->codec_id);
228 // For some formats (like PCM) always trust CODEC_ID_* more than codec_tag
229 if (override_tag)
230 codec->codec_tag = override_tag;
232 switch(codec->codec_type){
233 case CODEC_TYPE_AUDIO:{
234 WAVEFORMATEX *wf;
235 sh_audio_t* sh_audio;
236 sh_audio=new_sh_audio(demuxer, i);
237 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_AudioID, "lavf", i);
238 if(!sh_audio)
239 break;
240 priv->astreams[priv->audio_streams] = i;
241 priv->audio_streams++;
242 wf= calloc(sizeof(WAVEFORMATEX) + codec->extradata_size, 1);
243 // mp4a tag is used for all mp4 files no matter what they actually contain
244 if(codec->codec_tag == MKTAG('m', 'p', '4', 'a'))
245 codec->codec_tag= 0;
246 if(!codec->codec_tag)
247 codec->codec_tag= av_codec_get_tag(mp_wav_taglists, codec->codec_id);
248 wf->wFormatTag= codec->codec_tag;
249 wf->nChannels= codec->channels;
250 wf->nSamplesPerSec= codec->sample_rate;
251 wf->nAvgBytesPerSec= codec->bit_rate/8;
252 wf->nBlockAlign= codec->block_align ? codec->block_align : 1;
253 wf->wBitsPerSample= codec->bits_per_coded_sample;
254 wf->cbSize= codec->extradata_size;
255 if(codec->extradata_size)
256 memcpy(wf + 1, codec->extradata, codec->extradata_size);
257 sh_audio->wf= wf;
258 sh_audio->audio.dwSampleSize= codec->block_align;
259 if(codec->frame_size && codec->sample_rate){
260 sh_audio->audio.dwScale=codec->frame_size;
261 sh_audio->audio.dwRate= codec->sample_rate;
262 }else{
263 sh_audio->audio.dwScale= codec->block_align ? codec->block_align*8 : 8;
264 sh_audio->audio.dwRate = codec->bit_rate;
266 g= av_gcd(sh_audio->audio.dwScale, sh_audio->audio.dwRate);
267 sh_audio->audio.dwScale /= g;
268 sh_audio->audio.dwRate /= g;
269 // printf("sca:%d rat:%d fs:%d sr:%d ba:%d\n", sh_audio->audio.dwScale, sh_audio->audio.dwRate, codec->frame_size, codec->sample_rate, codec->block_align);
270 sh_audio->ds= demuxer->audio;
271 sh_audio->format= codec->codec_tag;
272 sh_audio->channels= codec->channels;
273 sh_audio->samplerate= codec->sample_rate;
274 sh_audio->i_bps= codec->bit_rate/8;
275 switch (codec->codec_id) {
276 case CODEC_ID_PCM_S8:
277 case CODEC_ID_PCM_U8:
278 sh_audio->samplesize = 1;
279 break;
280 case CODEC_ID_PCM_S16LE:
281 case CODEC_ID_PCM_S16BE:
282 case CODEC_ID_PCM_U16LE:
283 case CODEC_ID_PCM_U16BE:
284 sh_audio->samplesize = 2;
285 break;
286 case CODEC_ID_PCM_ALAW:
287 sh_audio->format = 0x6;
288 break;
289 case CODEC_ID_PCM_MULAW:
290 sh_audio->format = 0x7;
291 break;
293 if (lang && lang->value) {
294 sh_audio->lang = strdup(lang->value);
295 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", i, sh_audio->lang);
297 if (st->disposition & AV_DISPOSITION_DEFAULT)
298 sh_audio->default_track = 1;
299 if(mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf, MSGL_V);
300 // select the first audio stream
301 if (!demuxer->audio->sh) {
302 demuxer->audio->id = i;
303 demuxer->audio->sh= demuxer->a_streams[i];
304 } else
305 st->discard= AVDISCARD_ALL;
306 break;
308 case CODEC_TYPE_VIDEO:{
309 sh_video_t* sh_video;
310 BITMAPINFOHEADER *bih;
311 sh_video=new_sh_video(demuxer, i);
312 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_VideoID, "lavf", i);
313 if(!sh_video) break;
314 priv->vstreams[priv->video_streams] = i;
315 priv->video_streams++;
316 bih=calloc(sizeof(BITMAPINFOHEADER) + codec->extradata_size,1);
318 if(codec->codec_id == CODEC_ID_RAWVIDEO) {
319 switch (codec->pix_fmt) {
320 case PIX_FMT_RGB24:
321 codec->codec_tag= MKTAG(24, 'B', 'G', 'R');
324 if(!codec->codec_tag)
325 codec->codec_tag= av_codec_get_tag(mp_bmp_taglists, codec->codec_id);
326 bih->biSize= sizeof(BITMAPINFOHEADER) + codec->extradata_size;
327 bih->biWidth= codec->width;
328 bih->biHeight= codec->height;
329 bih->biBitCount= codec->bits_per_coded_sample;
330 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8;
331 bih->biCompression= codec->codec_tag;
332 sh_video->bih= bih;
333 sh_video->disp_w= codec->width;
334 sh_video->disp_h= codec->height;
335 if (st->time_base.den) { /* if container has time_base, use that */
336 sh_video->video.dwRate= st->time_base.den;
337 sh_video->video.dwScale= st->time_base.num;
338 } else {
339 sh_video->video.dwRate= codec->time_base.den;
340 sh_video->video.dwScale= codec->time_base.num;
342 sh_video->fps=av_q2d(st->r_frame_rate);
343 sh_video->frametime=1/av_q2d(st->r_frame_rate);
344 sh_video->format=bih->biCompression;
345 if(st->sample_aspect_ratio.num)
346 sh_video->aspect = codec->width * st->sample_aspect_ratio.num
347 / (float)(codec->height * st->sample_aspect_ratio.den);
348 else
349 sh_video->aspect=codec->width * codec->sample_aspect_ratio.num
350 / (float)(codec->height * codec->sample_aspect_ratio.den);
351 sh_video->i_bps=codec->bit_rate/8;
352 mp_msg(MSGT_DEMUX,MSGL_DBG2,"aspect= %d*%d/(%d*%d)\n",
353 codec->width, codec->sample_aspect_ratio.num,
354 codec->height, codec->sample_aspect_ratio.den);
356 sh_video->ds= demuxer->video;
357 if(codec->extradata_size)
358 memcpy(sh_video->bih + 1, codec->extradata, codec->extradata_size);
359 if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V);
361 short biPlanes;
362 int biXPelsPerMeter;
363 int biYPelsPerMeter;
364 int biClrUsed;
365 int biClrImportant;
367 if(demuxer->video->id != i && demuxer->video->id != -1)
368 st->discard= AVDISCARD_ALL;
369 else{
370 demuxer->video->id = i;
371 demuxer->video->sh= demuxer->v_streams[i];
373 break;
375 case CODEC_TYPE_SUBTITLE:{
376 sh_sub_t* sh_sub;
377 char type;
378 /* only support text subtitles for now */
379 if(codec->codec_id == CODEC_ID_TEXT)
380 type = 't';
381 else if(codec->codec_id == CODEC_ID_MOV_TEXT)
382 type = 'm';
383 else if(codec->codec_id == CODEC_ID_SSA)
384 type = 'a';
385 else if(codec->codec_id == CODEC_ID_DVD_SUBTITLE)
386 type = 'v';
387 else if(codec->codec_id == CODEC_ID_DVB_TELETEXT)
388 type = 'd';
389 else
390 break;
391 sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams);
392 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_SubtitleID, "lavf", priv->sub_streams);
393 if(!sh_sub) break;
394 priv->sstreams[priv->sub_streams] = i;
395 sh_sub->type = type;
396 if (codec->extradata_size) {
397 sh_sub->extradata = malloc(codec->extradata_size);
398 memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size);
399 sh_sub->extradata_len = codec->extradata_size;
401 if (lang && lang->value) {
402 sh_sub->lang = strdup(lang->value);
403 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", priv->sub_streams, sh_sub->lang);
405 if (st->disposition & AV_DISPOSITION_DEFAULT)
406 sh_sub->default_track = 1;
407 priv->sub_streams++;
408 break;
410 case CODEC_TYPE_ATTACHMENT:{
411 if (st->codec->codec_id == CODEC_ID_TTF)
412 demuxer_add_attachment(demuxer, st->filename,
413 "application/x-truetype-font",
414 codec->extradata, codec->extradata_size);
415 break;
417 default:
418 st->discard= AVDISCARD_ALL;
422 static demuxer_t* demux_open_lavf(demuxer_t *demuxer){
423 AVFormatContext *avfc;
424 AVFormatParameters ap;
425 const AVOption *opt;
426 AVMetadataTag *t = NULL;
427 lavf_priv_t *priv= demuxer->priv;
428 int i;
429 char mp_filename[256]="mp:";
431 memset(&ap, 0, sizeof(AVFormatParameters));
433 stream_seek(demuxer->stream, 0);
435 avfc = avformat_alloc_context();
437 if (opt_cryptokey)
438 parse_cryptokey(avfc, opt_cryptokey);
439 if (user_correct_pts != 0)
440 avfc->flags |= AVFMT_FLAG_GENPTS;
441 if (index_mode == 0)
442 avfc->flags |= AVFMT_FLAG_IGNIDX;
444 ap.prealloced_context = 1;
445 if(opt_probesize) {
446 opt = av_set_int(avfc, "probesize", opt_probesize);
447 if(!opt) mp_msg(MSGT_HEADER,MSGL_ERR, "demux_lavf, couldn't set option probesize to %u\n", opt_probesize);
449 if(opt_analyzeduration) {
450 opt = av_set_int(avfc, "analyzeduration", opt_analyzeduration * AV_TIME_BASE);
451 if(!opt) mp_msg(MSGT_HEADER,MSGL_ERR, "demux_lavf, couldn't set option analyzeduration to %u\n", opt_analyzeduration);
454 if(opt_avopt){
455 if(parse_avopts(avfc, opt_avopt) < 0){
456 mp_msg(MSGT_HEADER,MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", opt_avopt);
457 return NULL;
461 if(demuxer->stream->url)
462 strncpy(mp_filename + 3, demuxer->stream->url, sizeof(mp_filename)-3);
463 else
464 strncpy(mp_filename + 3, "foobar.dummy", sizeof(mp_filename)-3);
466 priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0,
467 demuxer->stream, mp_read, NULL, mp_seek);
468 priv->pb->is_streamed = !demuxer->stream->end_pos || (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK;
470 if(av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif, &ap)<0){
471 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n");
472 return NULL;
475 priv->avfc= avfc;
477 if(av_find_stream_info(avfc) < 0){
478 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_find_stream_info() failed\n");
479 return NULL;
482 /* Add metadata. */
483 av_metadata_conv(avfc, NULL, avfc->iformat->metadata_conv);
484 while((t = av_metadata_get(avfc->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
485 demux_info_add(demuxer, t->key, t->value);
487 for(i=0; i < avfc->nb_chapters; i++) {
488 AVChapter *c = avfc->chapters[i];
489 uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000});
490 uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000});
491 t = av_metadata_get(c->metadata, "title", NULL, 0);
492 demuxer_add_chapter(demuxer, t ? t->value : NULL, start, end);
495 for(i=0; i<avfc->nb_streams; i++)
496 handle_stream(demuxer, avfc, i);
497 if(avfc->nb_programs) {
498 int p;
499 for (p = 0; p < avfc->nb_programs; p++) {
500 AVProgram *program = avfc->programs[p];
501 t = av_metadata_get(program->metadata, "title", NULL, 0);
502 mp_msg(MSGT_HEADER,MSGL_INFO,"LAVF: Program %d %s\n", program->id, t ? t->value : "");
506 mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams);
507 mp_msg(MSGT_HEADER,MSGL_V,"LAVF: build %d\n", LIBAVFORMAT_BUILD);
508 if(!priv->audio_streams) demuxer->audio->id=-2; // nosound
509 // else if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio;
510 if(!priv->video_streams){
511 if(!priv->audio_streams){
512 mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF: no audio or video headers found - broken file?\n");
513 return NULL;
515 demuxer->video->id=-2; // audio-only
516 } //else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video;
518 return demuxer;
521 static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){
522 lavf_priv_t *priv= demux->priv;
523 AVPacket pkt;
524 demux_packet_t *dp;
525 demux_stream_t *ds;
526 int id;
527 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_lavf_fill_buffer()\n");
529 demux->filepos=stream_tell(demux->stream);
531 if(av_read_frame(priv->avfc, &pkt) < 0)
532 return 0;
534 id= pkt.stream_index;
536 if(id==demux->audio->id){
537 // audio
538 ds=demux->audio;
539 if(!ds->sh){
540 ds->sh=demux->a_streams[id];
541 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF audio ID = %d\n",ds->id);
543 } else if(id==demux->video->id){
544 // video
545 ds=demux->video;
546 if(!ds->sh){
547 ds->sh=demux->v_streams[id];
548 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF video ID = %d\n",ds->id);
550 } else if(id==demux->sub->id){
551 // subtitle
552 ds=demux->sub;
553 sub_utf8=1;
554 } else {
555 av_free_packet(&pkt);
556 return 1;
559 if(0/*pkt.destruct == av_destruct_packet*/){
560 //ok kids, dont try this at home :)
561 dp=malloc(sizeof(demux_packet_t));
562 dp->len=pkt.size;
563 dp->next=NULL;
564 dp->refcount=1;
565 dp->master=NULL;
566 dp->buffer=pkt.data;
567 pkt.destruct= NULL;
568 }else{
569 dp=new_demux_packet(pkt.size);
570 memcpy(dp->buffer, pkt.data, pkt.size);
571 av_free_packet(&pkt);
574 if(pkt.pts != AV_NOPTS_VALUE){
575 dp->pts=pkt.pts * av_q2d(priv->avfc->streams[id]->time_base);
576 priv->last_pts= dp->pts * AV_TIME_BASE;
577 if(pkt.convergence_duration)
578 dp->endpts = dp->pts + pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base);
580 dp->pos=demux->filepos;
581 dp->flags= !!(pkt.flags&PKT_FLAG_KEY);
582 // append packet to DS stream:
583 ds_add_packet(ds,dp);
584 return 1;
587 static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags){
588 lavf_priv_t *priv = demuxer->priv;
589 int avsflags = 0;
590 mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %f, %d)\n", demuxer, rel_seek_secs, audio_delay, flags);
592 if (flags & SEEK_ABSOLUTE) {
593 priv->last_pts = priv->avfc->start_time;
594 } else {
595 if (rel_seek_secs < 0) avsflags = AVSEEK_FLAG_BACKWARD;
597 if (flags & SEEK_FACTOR) {
598 if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE)
599 return;
600 priv->last_pts += rel_seek_secs * priv->avfc->duration;
601 } else {
602 priv->last_pts += rel_seek_secs * AV_TIME_BASE;
604 if (av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags) < 0) {
605 avsflags ^= AVSEEK_FLAG_BACKWARD;
606 av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags);
610 static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg)
612 lavf_priv_t *priv = demuxer->priv;
614 switch (cmd) {
615 case DEMUXER_CTRL_CORRECT_PTS:
616 return DEMUXER_CTRL_OK;
617 case DEMUXER_CTRL_GET_TIME_LENGTH:
618 if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE)
619 return DEMUXER_CTRL_DONTKNOW;
621 *((double *)arg) = (double)priv->avfc->duration / AV_TIME_BASE;
622 return DEMUXER_CTRL_OK;
624 case DEMUXER_CTRL_GET_PERCENT_POS:
625 if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE)
626 return DEMUXER_CTRL_DONTKNOW;
628 *((int *)arg) = (int)((priv->last_pts - priv->avfc->start_time)*100 / priv->avfc->duration);
629 return DEMUXER_CTRL_OK;
630 case DEMUXER_CTRL_SWITCH_AUDIO:
631 case DEMUXER_CTRL_SWITCH_VIDEO:
633 int id = *((int*)arg);
634 int newid = -2;
635 int i, curridx = -1;
636 int nstreams, *pstreams;
637 demux_stream_t *ds;
639 if(cmd == DEMUXER_CTRL_SWITCH_VIDEO)
641 ds = demuxer->video;
642 nstreams = priv->video_streams;
643 pstreams = priv->vstreams;
645 else
647 ds = demuxer->audio;
648 nstreams = priv->audio_streams;
649 pstreams = priv->astreams;
651 for(i = 0; i < nstreams; i++)
653 if(pstreams[i] == ds->id) //current stream id
655 curridx = i;
656 break;
660 if(id == -2) { // no sound
661 i = -1;
662 } else if(id == -1) { // next track
663 i = (curridx + 2) % (nstreams + 1) - 1;
664 if (i >= 0)
665 newid = pstreams[i];
667 else // select track by id
669 for(i = 0; i < nstreams; i++)
671 if(pstreams[i] == id)
673 newid = id;
674 break;
678 if(i == curridx)
679 return DEMUXER_CTRL_NOTIMPL;
680 else
682 ds_free_packs(ds);
683 if(ds->id >= 0)
684 priv->avfc->streams[ds->id]->discard = AVDISCARD_ALL;
685 *((int*)arg) = ds->id = newid;
686 if(newid >= 0)
687 priv->avfc->streams[newid]->discard = AVDISCARD_NONE;
688 return DEMUXER_CTRL_OK;
691 case DEMUXER_CTRL_IDENTIFY_PROGRAM:
693 demux_program_t *prog = arg;
694 AVProgram *program;
695 int p, i;
696 int start;
698 prog->vid = prog->aid = prog->sid = -2; //no audio and no video by default
699 if(priv->avfc->nb_programs < 1)
700 return DEMUXER_CTRL_DONTKNOW;
702 if(prog->progid == -1)
704 p = 0;
705 while(p<priv->avfc->nb_programs && priv->avfc->programs[p]->id != priv->cur_program)
706 p++;
707 p = (p + 1) % priv->avfc->nb_programs;
709 else
711 for(i=0; i<priv->avfc->nb_programs; i++)
712 if(priv->avfc->programs[i]->id == prog->progid)
713 break;
714 if(i==priv->avfc->nb_programs)
715 return DEMUXER_CTRL_DONTKNOW;
716 p = i;
718 start = p;
719 redo:
720 program = priv->avfc->programs[p];
721 for(i=0; i<program->nb_stream_indexes; i++)
723 switch(priv->avfc->streams[program->stream_index[i]]->codec->codec_type)
725 case CODEC_TYPE_VIDEO:
726 if(prog->vid == -2)
727 prog->vid = program->stream_index[i];
728 break;
729 case CODEC_TYPE_AUDIO:
730 if(prog->aid == -2)
731 prog->aid = program->stream_index[i];
732 break;
733 case CODEC_TYPE_SUBTITLE:
734 if(prog->sid == -2 && priv->avfc->streams[program->stream_index[i]]->codec->codec_id == CODEC_ID_TEXT)
735 prog->sid = program->stream_index[i];
736 break;
739 if(prog->progid == -1 && prog->vid == -2 && prog->aid == -2)
741 p = (p + 1) % priv->avfc->nb_programs;
742 if (p == start)
743 return DEMUXER_CTRL_DONTKNOW;
744 goto redo;
746 priv->cur_program = prog->progid = program->id;
747 return DEMUXER_CTRL_OK;
749 default:
750 return DEMUXER_CTRL_NOTIMPL;
754 static void demux_close_lavf(demuxer_t *demuxer)
756 lavf_priv_t* priv = demuxer->priv;
757 if (priv){
758 if(priv->avfc)
760 av_freep(&priv->avfc->key);
761 av_close_input_stream(priv->avfc);
763 av_freep(&priv->pb);
764 free(priv); demuxer->priv= NULL;
769 const demuxer_desc_t demuxer_desc_lavf = {
770 "libavformat demuxer",
771 "lavf",
772 "libavformat",
773 "Michael Niedermayer",
774 "supports many formats, requires libavformat",
775 DEMUXER_TYPE_LAVF,
776 0, // Check after other demuxer
777 lavf_check_file,
778 demux_lavf_fill_buffer,
779 demux_open_lavf,
780 demux_close_lavf,
781 demux_seek_lavf,
782 demux_lavf_control
785 const demuxer_desc_t demuxer_desc_lavf_preferred = {
786 "libavformat preferred demuxer",
787 "lavfpref",
788 "libavformat",
789 "Michael Niedermayer",
790 "supports many formats, requires libavformat",
791 DEMUXER_TYPE_LAVF_PREFERRED,
793 lavf_check_preferred_file,
794 demux_lavf_fill_buffer,
795 demux_open_lavf,
796 demux_close_lavf,
797 demux_seek_lavf,
798 demux_lavf_control