diff options
author | Uoti Urpala <uau@mplayer2.org> | 2011-07-03 15:42:04 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2011-07-03 18:39:26 +0300 |
commit | 774bb252aa0bda6a6ef927cd9287b0a6c01da0e6 (patch) | |
tree | e37802ce0f999f67da92b31ac542f565a8f0b3ee | |
parent | 1a8384401b8df76b07be93f8994fbfee152a20ad (diff) | |
download | mpv-774bb252aa0bda6a6ef927cd9287b0a6c01da0e6.tar.bz2 mpv-774bb252aa0bda6a6ef927cd9287b0a6c01da0e6.tar.xz |
cosmetics: reformat demux_lavf.c, m_option.[ch] and m_property.c
-rw-r--r-- | libmpdemux/demux_lavf.c | 993 | ||||
-rw-r--r-- | m_option.c | 3651 | ||||
-rw-r--r-- | m_option.h | 565 | ||||
-rw-r--r-- | m_property.c | 406 |
4 files changed, 2905 insertions, 2710 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index a3c1143e22..e8313fa4c2 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -48,7 +48,7 @@ #define INITIAL_PROBE_SIZE STREAM_BUFFER_SIZE #define SMALL_MAX_PROBE_SIZE (32 * 1024) -#define PROBE_BUF_SIZE (2*1024*1024) +#define PROBE_BUF_SIZE (2 * 1024 * 1024) const m_option_t lavfdopts_conf[] = { OPT_INTRANGE("probesize", lavfdopts.probesize, 0, 32, INT_MAX), @@ -79,40 +79,44 @@ typedef struct lavf_priv { bool use_dts; bool seek_by_bytes; int bitrate; -}lavf_priv_t; +} lavf_priv_t; -static int mp_read(void *opaque, uint8_t *buf, int size) { +static int mp_read(void *opaque, uint8_t *buf, int size) +{ struct demuxer *demuxer = opaque; struct stream *stream = demuxer->stream; int ret; - ret=stream_read(stream, buf, size); + ret = stream_read(stream, buf, size); - mp_msg(MSGT_HEADER,MSGL_DBG2,"%d=mp_read(%p, %p, %d), pos: %"PRId64", eof:%d\n", + mp_msg(MSGT_HEADER, MSGL_DBG2, + "%d=mp_read(%p, %p, %d), pos: %"PRId64", eof:%d\n", ret, stream, buf, size, stream_tell(stream), stream->eof); return ret; } -static int64_t mp_seek(void *opaque, int64_t pos, int whence) { +static int64_t mp_seek(void *opaque, int64_t pos, int whence) +{ struct demuxer *demuxer = opaque; struct stream *stream = demuxer->stream; int64_t current_pos; - mp_msg(MSGT_HEADER,MSGL_DBG2,"mp_seek(%p, %"PRId64", %d)\n", stream, pos, whence); - if(whence == SEEK_CUR) - pos +=stream_tell(stream); - else if(whence == SEEK_END && stream->end_pos > 0) + mp_msg(MSGT_HEADER, MSGL_DBG2, "mp_seek(%p, %"PRId64", %d)\n", + stream, pos, whence); + if (whence == SEEK_CUR) + pos += stream_tell(stream); + else if (whence == SEEK_END && stream->end_pos > 0) pos += stream->end_pos; - else if(whence == SEEK_SET) + else if (whence == SEEK_SET) pos += stream->start_pos; - else if(whence == AVSEEK_SIZE && stream->end_pos > 0) + else if (whence == AVSEEK_SIZE && stream->end_pos > 0) return stream->end_pos - stream->start_pos; else return -1; - if(pos<0) + if (pos < 0) return -1; current_pos = stream_tell(stream); - if(stream_seek(stream, pos)==0) { + if (stream_seek(stream, pos) == 0) { stream_reset(stream); stream_seek(stream, current_pos); return -1; @@ -135,14 +139,16 @@ static int64_t mp_read_seek(void *opaque, int stream_idx, int64_t ts, int flags) return ret; } -static void list_formats(void) { +static void list_formats(void) +{ mp_msg(MSGT_DEMUX, MSGL_INFO, "Available lavf input formats:\n"); AVInputFormat *fmt = NULL; while (fmt = av_iformat_next(fmt)) mp_msg(MSGT_DEMUX, MSGL_INFO, "%15s : %s\n", fmt->name, fmt->long_name); } -static int lavf_check_file(demuxer_t *demuxer){ +static int lavf_check_file(demuxer_t *demuxer) +{ struct MPOpts *opts = demuxer->opts; struct lavfdopts *lavfdopts = &opts->lavfdopts; AVProbeData avpd; @@ -151,9 +157,9 @@ static int lavf_check_file(demuxer_t *demuxer){ int read_size = INITIAL_PROBE_SIZE; int score; - if(!demuxer->priv) - demuxer->priv=calloc(sizeof(lavf_priv_t),1); - priv= demuxer->priv; + if (!demuxer->priv) + demuxer->priv = calloc(sizeof(lavf_priv_t), 1); + priv = demuxer->priv; av_register_all(); @@ -162,39 +168,41 @@ static int lavf_check_file(demuxer_t *demuxer){ format = demuxer->stream->lavf_type; if (format) { if (strcmp(format, "help") == 0) { - list_formats(); - return 0; + list_formats(); + return 0; } priv->avif = av_find_input_format(format); if (!priv->avif) { mp_msg(MSGT_DEMUX, MSGL_FATAL, "Unknown lavf format %s\n", format); return 0; } - mp_msg(MSGT_DEMUX,MSGL_INFO,"Forced lavf %s demuxer\n", priv->avif->long_name); + mp_msg(MSGT_DEMUX, MSGL_INFO, "Forced lavf %s demuxer\n", + priv->avif->long_name); return DEMUXER_TYPE_LAVF; } avpd.buf = av_mallocz(FFMAX(BIO_BUFFER_SIZE, PROBE_BUF_SIZE) + FF_INPUT_BUFFER_PADDING_SIZE); do { - read_size = stream_read(demuxer->stream, avpd.buf + probe_data_size, read_size); - if(read_size < 0) { + read_size = stream_read(demuxer->stream, avpd.buf + probe_data_size, + read_size); + if (read_size < 0) { av_free(avpd.buf); return 0; } probe_data_size += read_size; - avpd.filename= demuxer->stream->url; + avpd.filename = demuxer->stream->url; if (!avpd.filename) { mp_msg(MSGT_DEMUX, MSGL_WARN, "Stream url is not set!\n"); avpd.filename = ""; } if (!strncmp(avpd.filename, "ffmpeg://", 9)) avpd.filename += 9; - avpd.buf_size= probe_data_size; + avpd.buf_size = probe_data_size; score = 0; - priv->avif= av_probe_input_format2(&avpd, probe_data_size > 0, &score); - read_size = FFMIN(2*read_size, PROBE_BUF_SIZE - probe_data_size); + priv->avif = av_probe_input_format2(&avpd, probe_data_size > 0, &score); + read_size = FFMIN(2 * read_size, PROBE_BUF_SIZE - probe_data_size); } while ((demuxer->desc->type != DEMUXER_TYPE_LAVF_PREFERRED || probe_data_size < SMALL_MAX_PROBE_SIZE) && score <= AVPROBE_SCORE_MAX / 4 && @@ -202,10 +210,11 @@ static int lavf_check_file(demuxer_t *demuxer){ av_free(avpd.buf); if (!priv->avif || score <= AVPROBE_SCORE_MAX / 4) { - mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: no clue about this gibberish!\n"); + mp_msg(MSGT_HEADER, MSGL_V, + "LAVF_check: no clue about this gibberish!\n"); return 0; - }else - mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: %s\n", priv->avif->long_name); + } else + mp_msg(MSGT_HEADER, MSGL_V, "LAVF_check: %s\n", priv->avif->long_name); demuxer->filetype = priv->avif->long_name; if (!demuxer->filetype) @@ -245,7 +254,8 @@ static const char * const preferred_internal[] = { NULL }; -static int lavf_check_preferred_file(demuxer_t *demuxer){ +static int lavf_check_preferred_file(demuxer_t *demuxer) +{ if (lavf_check_file(demuxer)) { const char * const *p; lavf_priv_t *priv = demuxer->priv; @@ -257,14 +267,16 @@ static int lavf_check_preferred_file(demuxer_t *demuxer){ return 0; } -static uint8_t char2int(char c) { +static uint8_t char2int(char c) +{ if (c >= '0' && c <= '9') return c - '0'; if (c >= 'a' && c <= 'f') return c - 'a' + 10; if (c >= 'A' && c <= 'F') return c - 'A' + 10; return 0; } -static void parse_cryptokey(AVFormatContext *avfc, const char *str) { +static void parse_cryptokey(AVFormatContext *avfc, const char *str) +{ int len = strlen(str) / 2; uint8_t *key = av_mallocz(len); int i; @@ -274,246 +286,254 @@ static void parse_cryptokey(AVFormatContext *avfc, const char *str) { *key++ = (char2int(str[0]) << 4) | char2int(str[1]); } -static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { - lavf_priv_t *priv= demuxer->priv; - AVStream *st= avfc->streams[i]; - AVCodecContext *codec= st->codec; +static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) +{ + lavf_priv_t *priv = demuxer->priv; + AVStream *st = avfc->streams[i]; + AVCodecContext *codec = st->codec; char *stream_type = NULL; int stream_id; AVMetadataTag *lang = av_metadata_get(st->metadata, "language", NULL, 0); - AVMetadataTag *title= av_metadata_get(st->metadata, "title", NULL, 0); + AVMetadataTag *title = av_metadata_get(st->metadata, "title", NULL, 0); int g, override_tag = mp_av_codec_get_tag(mp_codecid_override_taglists, codec->codec_id); // For some formats (like PCM) always trust CODEC_ID_* more than codec_tag if (override_tag) codec->codec_tag = override_tag; - switch(codec->codec_type){ - case AVMEDIA_TYPE_AUDIO:{ - WAVEFORMATEX *wf; - sh_audio_t* sh_audio; - sh_audio = new_sh_audio_aid(demuxer, i, priv->audio_streams); - if(!sh_audio) - break; - stream_type = "audio"; - priv->astreams[priv->audio_streams] = i; - wf= calloc(sizeof(*wf) + codec->extradata_size, 1); - // mp4a tag is used for all mp4 files no matter what they actually contain - if(codec->codec_tag == MKTAG('m', 'p', '4', 'a')) - codec->codec_tag= 0; - if(!codec->codec_tag) - codec->codec_tag= mp_av_codec_get_tag(mp_wav_taglists, codec->codec_id); - wf->wFormatTag= codec->codec_tag; - wf->nChannels= codec->channels; - wf->nSamplesPerSec= codec->sample_rate; - wf->nAvgBytesPerSec= codec->bit_rate/8; - wf->nBlockAlign= codec->block_align ? codec->block_align : 1; - wf->wBitsPerSample= codec->bits_per_coded_sample; - wf->cbSize= codec->extradata_size; - if(codec->extradata_size) - memcpy(wf + 1, codec->extradata, codec->extradata_size); - sh_audio->wf= wf; - sh_audio->audio.dwSampleSize= codec->block_align; - if(codec->frame_size && codec->sample_rate){ - sh_audio->audio.dwScale=codec->frame_size; - sh_audio->audio.dwRate= codec->sample_rate; - }else{ - sh_audio->audio.dwScale= codec->block_align ? codec->block_align*8 : 8; - sh_audio->audio.dwRate = codec->bit_rate; - } - g= av_gcd(sh_audio->audio.dwScale, sh_audio->audio.dwRate); - sh_audio->audio.dwScale /= g; - sh_audio->audio.dwRate /= g; -// 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); - sh_audio->ds= demuxer->audio; - sh_audio->format= codec->codec_tag; - sh_audio->channels= codec->channels; - sh_audio->samplerate= codec->sample_rate; - sh_audio->i_bps= codec->bit_rate/8; - switch (codec->codec_id) { - case CODEC_ID_PCM_S8: - case CODEC_ID_PCM_U8: - sh_audio->samplesize = 1; - break; - case CODEC_ID_PCM_S16LE: - case CODEC_ID_PCM_S16BE: - case CODEC_ID_PCM_U16LE: - case CODEC_ID_PCM_U16BE: - sh_audio->samplesize = 2; - break; - case CODEC_ID_PCM_ALAW: - sh_audio->format = 0x6; - break; - case CODEC_ID_PCM_MULAW: - sh_audio->format = 0x7; - break; - } - if (title && title->value) - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", priv->audio_streams, title->value); - if (lang && lang->value) { - sh_audio->lang = talloc_strdup(sh_audio, lang->value); - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", priv->audio_streams, sh_audio->lang); - } - if (st->disposition & AV_DISPOSITION_DEFAULT) - sh_audio->default_track = 1; - if(mp_msg_test(MSGT_HEADER,MSGL_V) ) print_wave_header(sh_audio->wf, MSGL_V); - st->discard= AVDISCARD_ALL; - stream_id = priv->audio_streams++; + switch (codec->codec_type) { + case AVMEDIA_TYPE_AUDIO: { + WAVEFORMATEX *wf; + sh_audio_t *sh_audio; + sh_audio = new_sh_audio_aid(demuxer, i, priv->audio_streams); + if (!sh_audio) break; + stream_type = "audio"; + priv->astreams[priv->audio_streams] = i; + wf = calloc(sizeof(*wf) + codec->extradata_size, 1); + // mp4a tag is used for all mp4 files no matter what they actually contain + if (codec->codec_tag == MKTAG('m', 'p', '4', 'a')) + codec->codec_tag = 0; + if (!codec->codec_tag) + codec->codec_tag = mp_av_codec_get_tag(mp_wav_taglists, + codec->codec_id); + wf->wFormatTag = codec->codec_tag; + wf->nChannels = codec->channels; + wf->nSamplesPerSec = codec->sample_rate; + wf->nAvgBytesPerSec = codec->bit_rate / 8; + wf->nBlockAlign = codec->block_align ? codec->block_align : 1; + wf->wBitsPerSample = codec->bits_per_coded_sample; + wf->cbSize = codec->extradata_size; + if (codec->extradata_size) + memcpy(wf + 1, codec->extradata, codec->extradata_size); + sh_audio->wf = wf; + sh_audio->audio.dwSampleSize = codec->block_align; + if (codec->frame_size && codec->sample_rate) { + sh_audio->audio.dwScale = codec->frame_size; + sh_audio->audio.dwRate = codec->sample_rate; + } else { + sh_audio->audio.dwScale = codec->block_align ? codec->block_align * 8 : 8; + sh_audio->audio.dwRate = codec->bit_rate; } - case AVMEDIA_TYPE_VIDEO:{ - sh_video_t* sh_video; - BITMAPINFOHEADER *bih; - sh_video=new_sh_video_vid(demuxer, i, priv->video_streams); - if(!sh_video) break; - stream_type = "video"; - priv->vstreams[priv->video_streams] = i; - bih=calloc(sizeof(*bih) + codec->extradata_size,1); - - if(codec->codec_id == CODEC_ID_RAWVIDEO) { - switch (codec->pix_fmt) { - case PIX_FMT_RGB24: - codec->codec_tag= MKTAG(24, 'B', 'G', 'R'); - case PIX_FMT_BGR24: - codec->codec_tag= MKTAG(24, 'R', 'G', 'B'); - } - } - if(!codec->codec_tag) - codec->codec_tag= mp_av_codec_get_tag(mp_bmp_taglists, codec->codec_id); - bih->biSize= sizeof(*bih) + codec->extradata_size; - bih->biWidth= codec->width; - bih->biHeight= codec->height; - bih->biBitCount= codec->bits_per_coded_sample; - bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8; - bih->biCompression= codec->codec_tag; - sh_video->bih= bih; - sh_video->disp_w= codec->width; - sh_video->disp_h= codec->height; - if (st->time_base.den) { /* if container has time_base, use that */ - sh_video->video.dwRate= st->time_base.den; - sh_video->video.dwScale= st->time_base.num; - } else { - sh_video->video.dwRate= codec->time_base.den; - sh_video->video.dwScale= codec->time_base.num; - } - sh_video->fps=av_q2d(st->r_frame_rate); - sh_video->frametime=1/av_q2d(st->r_frame_rate); - sh_video->format=bih->biCompression; - if(st->sample_aspect_ratio.num) - sh_video->aspect = codec->width * st->sample_aspect_ratio.num - / (float)(codec->height * st->sample_aspect_ratio.den); - else - sh_video->aspect=codec->width * codec->sample_aspect_ratio.num - / (float)(codec->height * codec->sample_aspect_ratio.den); - sh_video->i_bps=codec->bit_rate/8; - if (title && title->value) - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", priv->video_streams, title->value); - mp_msg(MSGT_DEMUX,MSGL_DBG2,"aspect= %d*%d/(%d*%d)\n", - codec->width, codec->sample_aspect_ratio.num, - codec->height, codec->sample_aspect_ratio.den); - - sh_video->ds= demuxer->video; - if(codec->extradata_size) - memcpy(sh_video->bih + 1, codec->extradata, codec->extradata_size); - if( mp_msg_test(MSGT_HEADER,MSGL_V) ) print_video_header(sh_video->bih, MSGL_V); - /* - short biPlanes; - int biXPelsPerMeter; - int biYPelsPerMeter; - int biClrUsed; - int biClrImportant; - */ - if(demuxer->video->id != priv->video_streams - && demuxer->video->id != -1) - st->discard= AVDISCARD_ALL; - else{ - demuxer->video->id = i; - demuxer->video->sh= demuxer->v_streams[i]; - } - stream_id = priv->video_streams++; + g = av_gcd(sh_audio->audio.dwScale, sh_audio->audio.dwRate); + sh_audio->audio.dwScale /= g; + sh_audio->audio.dwRate /= g; +// 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); + sh_audio->ds = demuxer->audio; + sh_audio->format = codec->codec_tag; + sh_audio->channels = codec->channels; + sh_audio->samplerate = codec->sample_rate; + sh_audio->i_bps = codec->bit_rate / 8; + switch (codec->codec_id) { + case CODEC_ID_PCM_S8: + case CODEC_ID_PCM_U8: + sh_audio->samplesize = 1; + break; + case CODEC_ID_PCM_S16LE: + case CODEC_ID_PCM_S16BE: + case CODEC_ID_PCM_U16LE: + case CODEC_ID_PCM_U16BE: + sh_audio->samplesize = 2; + break; + case CODEC_ID_PCM_ALAW: + sh_audio->format = 0x6; + break; + case CODEC_ID_PCM_MULAW: + sh_audio->format = 0x7; break; } - case AVMEDIA_TYPE_SUBTITLE:{ - sh_sub_t* sh_sub; - char type; - /* only support text subtitles for now */ - if(codec->codec_id == CODEC_ID_TEXT) - type = 't'; - else if(codec->codec_id == CODEC_ID_MOV_TEXT) - type = 'm'; - else if(codec->codec_id == CODEC_ID_SSA) - type = 'a'; - else if(codec->codec_id == CODEC_ID_DVD_SUBTITLE) - type = 'v'; - else if(codec->codec_id == CODEC_ID_XSUB) - type = 'x'; - else if(codec->codec_id == CODEC_ID_DVB_SUBTITLE) - type = 'b'; - else if(codec->codec_id == CODEC_ID_DVB_TELETEXT) - type = 'd'; - else if(codec->codec_id == CODEC_ID_HDMV_PGS_SUBTITLE) - type = 'p'; - else - break; - sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams); - if(!sh_sub) break; - stream_type = "subtitle"; - priv->sstreams[priv->sub_streams] = i; - sh_sub->type = type; - if (codec->extradata_size) { - sh_sub->extradata = malloc(codec->extradata_size); - memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size); - sh_sub->extradata_len = codec->extradata_size; - } - if (title && title->value) - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", priv->sub_streams, title->value); - if (lang && lang->value) { - sh_sub->lang = talloc_strdup(sh_sub, lang->value); - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", priv->sub_streams, sh_sub->lang); - } - if (st->disposition & AV_DISPOSITION_DEFAULT) - sh_sub->default_track = 1; - stream_id = priv->sub_streams++; + if (title && title->value) + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", + priv->audio_streams, title->value); + if (lang && lang->value) { + sh_audio->lang = talloc_strdup(sh_audio, lang->value); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_LANG=%s\n", + priv->audio_streams, sh_audio->lang); + } + if (st->disposition & AV_DISPOSITION_DEFAULT) + sh_audio->default_track = 1; + if (mp_msg_test(MSGT_HEADER, MSGL_V)) + print_wave_header(sh_audio->wf, MSGL_V); + st->discard = AVDISCARD_ALL; + stream_id = priv->audio_streams++; + break; + } + case AVMEDIA_TYPE_VIDEO: { + sh_video_t *sh_video; + BITMAPINFOHEADER *bih; + sh_video = new_sh_video_vid(demuxer, i, priv->video_streams); + if (!sh_video) break; + stream_type = "video"; + priv->vstreams[priv->video_streams] = i; + bih = calloc(sizeof(*bih) + codec->extradata_size, 1); + + if (codec->codec_id == CODEC_ID_RAWVIDEO) { + switch (codec->pix_fmt) { + case PIX_FMT_RGB24: + codec->codec_tag = MKTAG(24, 'B', 'G', 'R'); + case PIX_FMT_BGR24: + codec->codec_tag = MKTAG(24, 'R', 'G', 'B'); + } + } + if (!codec->codec_tag) + codec->codec_tag = mp_av_codec_get_tag(mp_bmp_taglists, + codec->codec_id); + bih->biSize = sizeof(*bih) + codec->extradata_size; + bih->biWidth = codec->width; + bih->biHeight = codec->height; + bih->biBitCount = codec->bits_per_coded_sample; + bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8; + bih->biCompression = codec->codec_tag; + sh_video->bih = bih; + sh_video->disp_w = codec->width; + sh_video->disp_h = codec->height; + if (st->time_base.den) { /* if container has time_base, use that */ + sh_video->video.dwRate = st->time_base.den; + sh_video->video.dwScale = st->time_base.num; + } else { + sh_video->video.dwRate = codec->time_base.den; + sh_video->video.dwScale = codec->time_base.num; + } + sh_video->fps = av_q2d(st->r_frame_rate); + sh_video->frametime = 1 / av_q2d(st->r_frame_rate); + sh_video->format = bih->biCompression; + if (st->sample_aspect_ratio.num) + sh_video->aspect = codec->width * st->sample_aspect_ratio.num + / (float)(codec->height * st->sample_aspect_ratio.den); + else + sh_video->aspect = codec->width * codec->sample_aspect_ratio.num + / (float)(codec->height * codec->sample_aspect_ratio.den); + sh_video->i_bps = codec->bit_rate / 8; + if (title && title->value) + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", + priv->video_streams, title->value); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "aspect= %d*%d/(%d*%d)\n", + codec->width, codec->sample_aspect_ratio.num, + codec->height, codec->sample_aspect_ratio.den); + + sh_video->ds = demuxer->video; + if (codec->extradata_size) + memcpy(sh_video->bih + 1, codec->extradata, codec->extradata_size); + if ( mp_msg_test(MSGT_HEADER, MSGL_V)) + print_video_header(sh_video->bih, MSGL_V); + if (demuxer->video->id != priv->video_streams + && demuxer->video->id != -1) + st->discard = AVDISCARD_ALL; + else { + demuxer->video->id = i; + demuxer->video->sh = demuxer->v_streams[i]; } - case AVMEDIA_TYPE_ATTACHMENT:{ - AVMetadataTag *ftag = av_metadata_get(st->metadata, "filename", - NULL, 0); - char *filename = ftag ? ftag->value : NULL; - if (st->codec->codec_id == CODEC_ID_TTF) - demuxer_add_attachment(demuxer, BSTR(filename), - BSTR("application/x-truetype-font"), - (struct bstr){codec->extradata, - codec->extradata_size}); + stream_id = priv->video_streams++; + break; + } + case AVMEDIA_TYPE_SUBTITLE: { + sh_sub_t *sh_sub; + char type; + /* only support text subtitles for now */ + if (codec->codec_id == CODEC_ID_TEXT) + type = 't'; + else if (codec->codec_id == CODEC_ID_MOV_TEXT) + type = 'm'; + else if (codec->codec_id == CODEC_ID_SSA) + type = 'a'; + else if (codec->codec_id == CODEC_ID_DVD_SUBTITLE) + type = 'v'; + else if (codec->codec_id == CODEC_ID_XSUB) + type = 'x'; + else if (codec->codec_id == CODEC_ID_DVB_SUBTITLE) + type = 'b'; + else if (codec->codec_id == CODEC_ID_DVB_TELETEXT) + type = 'd'; + else if (codec->codec_id == CODEC_ID_HDMV_PGS_SUBTITLE) + type = 'p'; + else + break; + sh_sub = new_sh_sub_sid(demuxer, i, priv->sub_streams); + if (!sh_sub) break; + stream_type = "subtitle"; + priv->sstreams[priv->sub_streams] = i; + sh_sub->type = type; + if (codec->extradata_size) { + sh_sub->extradata = malloc(codec->extradata_size); + memcpy(sh_sub->extradata, codec->extradata, codec->extradata_size); + sh_sub->extradata_len = codec->extradata_size; } - default: - st->discard= AVDISCARD_ALL; + if (title && title->value) + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", + priv->sub_streams, title->value); + if (lang && lang->value) { + sh_sub->lang = talloc_strdup(sh_sub, lang->value); + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", + priv->sub_streams, sh_sub->lang); + } + if (st->disposition & AV_DISPOSITION_DEFAULT) + sh_sub->default_track = 1; + stream_id = priv->sub_streams++; + break; + } + case AVMEDIA_TYPE_ATTACHMENT: { + AVMetadataTag *ftag = av_metadata_get(st->metadata, "filename", + NULL, 0); + char *filename = ftag ? ftag->value : NULL; + if (st->codec->codec_id == CODEC_ID_TTF) + demuxer_add_attachment(demuxer, BSTR(filename), + BSTR("application/x-truetype-font"), + (struct bstr){codec->extradata, + codec->extradata_size}); + break; + } + default: + st->discard = AVDISCARD_ALL; } if (stream_type) { AVCodec *avc = avcodec_find_decoder(codec->codec_id); const char *codec_name = avc ? avc->name : "unknown"; if (!avc && *stream_type == 's' && demuxer->s_streams[stream_id]) codec_name = sh_sub_type2str(((sh_sub_t *)demuxer->s_streams[stream_id])->type); - mp_msg(MSGT_DEMUX, MSGL_INFO, "[lavf] stream %d: %s (%s), -%cid %d", i, stream_type, codec_name, *stream_type, stream_id); + mp_msg(MSGT_DEMUX, MSGL_INFO, "[lavf] stream %d: %s (%s), -%cid %d", + i, stream_type, codec_name, *stream_type, stream_id); if (lang && lang->value && *stream_type != 'v') - mp_msg(MSGT_DEMUX, MSGL_INFO, ", -%clang %s", *stream_type, lang->value); + mp_msg(MSGT_DEMUX, MSGL_INFO, ", -%clang %s", + *stream_type, lang->value); if (title && title->value) mp_msg(MSGT_DEMUX, MSGL_INFO, ", %s", title->value); mp_msg(MSGT_DEMUX, MSGL_INFO, "\n"); } } -static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ +static demuxer_t *demux_open_lavf(demuxer_t *demuxer) +{ struct MPOpts *opts = demuxer->opts; struct lavfdopts *lavfdopts = &opts->lavfdopts; AVFormatContext *avfc; AVFormatParameters ap; const AVOption *opt; AVMetadataTag *t = NULL; - lavf_priv_t *priv= demuxer->priv; + lavf_priv_t *priv = demuxer->priv; int i; - char mp_filename[256]="mp:"; + char mp_filename[256] = "mp:"; memset(&ap, 0, sizeof(AVFormatParameters)); @@ -538,7 +558,10 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ ap.prealloced_context = 1; if (lavfdopts->probesize) { opt = av_set_int(avfc, "probesize", lavfdopts->probesize); - if(!opt) mp_msg(MSGT_HEADER,MSGL_ERR, "demux_lavf, couldn't set option probesize to %u\n", lavfdopts->probesize); + if (!opt) + mp_msg(MSGT_HEADER, MSGL_ERR, + "demux_lavf, couldn't set option probesize to %u\n", + lavfdopts->probesize); } if (lavfdopts->analyzeduration) { opt = av_set_int(avfc, "analyzeduration", @@ -548,16 +571,19 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ "analyzeduration to %u\n", lavfdopts->analyzeduration); } - if (lavfdopts->avopt){ - if(parse_avopts(avfc, lavfdopts->avopt) < 0){ - mp_msg(MSGT_HEADER,MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", lavfdopts->avopt); + if (lavfdopts->avopt) { + if (parse_avopts(avfc, lavfdopts->avopt) < 0) { + mp_msg(MSGT_HEADER, MSGL_ERR, + "Your options /%s/ look like gibberish to me pal\n", + lavfdopts->avopt); return NULL; } } - if(demuxer->stream->url) { + if (demuxer->stream->url) { if (!strncmp(demuxer->stream->url, "ffmpeg://rtsp:", 14)) - av_strlcpy(mp_filename, demuxer->stream->url + 9, sizeof(mp_filename)); + av_strlcpy(mp_filename, demuxer->stream->url + 9, + sizeof(mp_filename)); else av_strlcat(mp_filename, demuxer->stream->url, sizeof(mp_filename)); } else @@ -566,57 +592,68 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0, demuxer, mp_read, NULL, mp_seek); priv->pb->read_seek = mp_read_seek; - priv->pb->is_streamed = !demuxer->stream->end_pos || (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK; + priv->pb->is_streamed = !demuxer->stream->end_pos || + (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK; - if(av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif, &ap)<0){ - mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n"); + if (av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif, + &ap) < 0) { + mp_msg(MSGT_HEADER, MSGL_ERR, + "LAVF_header: av_open_input_stream() failed\n"); return NULL; } - priv->avfc= avfc; + priv->avfc = avfc; - if(av_find_stream_info(avfc) < 0){ - mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_find_stream_info() failed\n"); + if (av_find_stream_info(avfc) < 0) { + mp_msg(MSGT_HEADER, MSGL_ERR, + "LAVF_header: av_find_stream_info() failed\n"); return NULL; } /* Add metadata. */ av_metadata_conv(avfc, NULL, avfc->iformat->metadata_conv); - while((t = av_metadata_get(avfc->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) + while ((t = av_metadata_get(avfc->metadata, "", t, + AV_METADATA_IGNORE_SUFFIX))) demux_info_add(demuxer, t->key, t->value); - for(i=0; i < avfc->nb_chapters; i++) { + for (i = 0; i < avfc->nb_chapters; i++) { AVChapter *c = avfc->chapters[i]; - uint64_t start = av_rescale_q(c->start, c->time_base, (AVRational){1,1000000000}); - uint64_t end = av_rescale_q(c->end, c->time_base, (AVRational){1,1000000000}); + uint64_t start = av_rescale_q(c->start, c->time_base, + (AVRational){1, 1000000000}); + uint64_t end = av_rescale_q(c->end, c->time_base, + (AVRational){1, 1000000000}); t = av_metadata_get(c->metadata, "title", NULL, 0); - demuxer_add_chapter(demuxer, t ? BSTR(t->value) : BSTR(NULL), start, end); + demuxer_add_chapter(demuxer, t ? BSTR(t->value) : BSTR(NULL), + start, end); } - for(i=0; i<avfc->nb_streams; i++) + for (i = 0; i < avfc->nb_streams; i++) handle_stream(demuxer, avfc, i); priv->nb_streams_last = avfc->nb_streams; - if(avfc->nb_programs) { + if (avfc->nb_programs) { int p; for (p = 0; p < avfc->nb_programs; p++) { AVProgram *program = avfc->programs[p]; t = av_metadata_get(program->metadata, "title", NULL, 0); - mp_msg(MSGT_HEADER,MSGL_INFO,"LAVF: Program %d %s\n", program->id, t ? t->value : ""); + mp_msg(MSGT_HEADER, MSGL_INFO, "LAVF: Program %d %s\n", + program->id, t ? t->value : ""); mp_msg(MSGT_IDENTIFY, MSGL_V, "PROGRAM_ID=%d\n", program->id); } } - mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams); - mp_msg(MSGT_HEADER,MSGL_V,"LAVF: build %d\n", LIBAVFORMAT_BUILD); + mp_msg(MSGT_HEADER, MSGL_V, "LAVF: %d audio and %d video streams found\n", + priv->audio_streams, priv->video_streams); + mp_msg(MSGT_HEADER, MSGL_V, "LAVF: build %d\n", LIBAVFORMAT_BUILD); demuxer->audio->id = -2; // wait for higher-level code to select track - if(!priv->video_streams){ - if(!priv->audio_streams){ - mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF: no audio or video headers found - broken file?\n"); + if (!priv->video_streams) { + if (!priv->audio_streams) { + mp_msg(MSGT_HEADER, MSGL_ERR, + "LAVF: no audio or video headers found - broken file?\n"); return NULL; } - demuxer->video->id=-2; // audio-only - } //else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video; + demuxer->video->id = -2; // audio-only + } // disabled because unreliable per-stream bitrate values returned // by libavformat trigger this heuristic incorrectly and break things @@ -653,7 +690,7 @@ static void check_internet_radio_hack(struct demuxer *demuxer) return; if (avfc->nb_streams - priv->nb_streams_last == 1 && priv->video_streams == 0 && priv->sub_streams == 0 - && demuxer->a_streams[priv->audio_streams-1]->format == 0x566f // vorbis + && demuxer->a_streams[priv->audio_streams - 1]->format == 0x566f // vorbis && (priv->audio_streams == 2 || priv->internet_radio_hack) && demuxer->a_streams[0]->format == 0x566f) { // extradata match could be checked but would require parsing @@ -683,7 +720,7 @@ static void check_internet_radio_hack(struct demuxer *demuxer) AVMetadataTag *t = NULL; AVStream *stream = avfc->streams[avfc->nb_streams - 1]; while ((t = av_metadata_get(stream->metadata, "", t, - AV_METADATA_IGNORE_SUFFIX))) + AV_METADATA_IGNORE_SUFFIX))) demux_info_add(demuxer, t->key, t->value); } else { if (priv->internet_radio_hack) @@ -694,17 +731,18 @@ static void check_internet_radio_hack(struct demuxer *demuxer) } } -static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){ - lavf_priv_t *priv= demux->priv; +static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds) +{ + lavf_priv_t *priv = demux->priv; AVPacket pkt; demux_packet_t *dp; |