From 774bb252aa0bda6a6ef927cd9287b0a6c01da0e6 Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Sun, 3 Jul 2011 15:42:04 +0300 Subject: cosmetics: reformat demux_lavf.c, m_option.[ch] and m_property.c --- libmpdemux/demux_lavf.c | 993 ++++++------- m_option.c | 3651 +++++++++++++++++++++++++---------------------- m_option.h | 565 ++++---- 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; inb_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; demux_stream_t *ds; int id; - mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_lavf_fill_buffer()\n"); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_lavf_fill_buffer()\n"); - demux->filepos=stream_tell(demux->stream); + demux->filepos = stream_tell(demux->stream); - if(av_read_frame(priv->avfc, &pkt) < 0) + if (av_read_frame(priv->avfc, &pkt) < 0) return 0; // handle any new streams that might have been added @@ -714,67 +752,74 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){ priv->nb_streams_last = priv->avfc->nb_streams; - id= pkt.stream_index; + id = pkt.stream_index; if (id == demux->audio->id || priv->internet_radio_hack) { // audio - ds=demux->audio; - if(!ds->sh){ - ds->sh=demux->a_streams[id]; - mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF audio ID = %d\n",ds->id); + ds = demux->audio; + if (!ds->sh) { + ds->sh = demux->a_streams[id]; + mp_msg(MSGT_DEMUX, MSGL_V, "Auto-selected LAVF audio ID = %d\n", + ds->id); } - } else if(id==demux->video->id){ + } else if (id == demux->video->id) { // video - ds=demux->video; - if(!ds->sh){ - ds->sh=demux->v_streams[id]; - mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF video ID = %d\n",ds->id); + ds = demux->video; + if (!ds->sh) { + ds->sh = demux->v_streams[id]; + mp_msg(MSGT_DEMUX, MSGL_V, "Auto-selected LAVF video ID = %d\n", + ds->id); } - } else if(id==demux->sub->id){ + } else if (id == demux->sub->id) { // subtitle - ds=demux->sub; - sub_utf8=1; + ds = demux->sub; + sub_utf8 = 1; } else { av_free_packet(&pkt); return 1; } - if(0/*pkt.destruct == av_destruct_packet*/){ + if (0 /*pkt.destruct == av_destruct_packet*/) { //ok kids, dont try this at home :) - dp=malloc(sizeof(demux_packet_t)); - dp->len=pkt.size; - dp->next=NULL; - dp->refcount=1; - dp->master=NULL; - dp->buffer=pkt.data; - pkt.destruct= NULL; - }else{ - dp=new_demux_packet(pkt.size); + dp = malloc(sizeof(demux_packet_t)); + dp->len = pkt.size; + dp->next = NULL; + dp->refcount = 1; + dp->master = NULL; + dp->buffer = pkt.data; + pkt.destruct = NULL; + } else { + dp = new_demux_packet(pkt.size); memcpy(dp->buffer, pkt.data, pkt.size); av_free_packet(&pkt); } int64_t ts = priv->use_dts ? pkt.dts : pkt.pts; - if(ts != AV_NOPTS_VALUE){ + if (ts != AV_NOPTS_VALUE) { dp->pts = ts * av_q2d(priv->avfc->streams[id]->time_base); - priv->last_pts= dp->pts * AV_TIME_BASE; + priv->last_pts = dp->pts * AV_TIME_BASE; // always set duration for subtitles, even if AV_PKT_FLAG_KEY isn't set, - // otherwise they will stay on screen to long if e.g. ASS is demuxed from mkv + // otherwise they will stay on screen to long if e.g. ASS is demuxed + // from mkv if ((ds == demux->sub || (pkt.flags & AV_PKT_FLAG_KEY)) && - pkt.convergence_duration > 0) - dp->duration = pkt.convergence_duration * av_q2d(priv->avfc->streams[id]->time_base); + pkt.convergence_duration > 0) + dp->duration = pkt.convergence_duration * + av_q2d(priv->avfc->streams[id]->time_base); } - dp->pos=demux->filepos; + dp->pos = demux->filepos; dp->flags = !!(pkt.flags & AV_PKT_FLAG_KEY); // append packet to DS stream: - ds_add_packet(ds,dp); + ds_add_packet(ds, dp); return 1; } -static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags){ +static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, + float audio_delay, int flags) +{ lavf_priv_t *priv = demuxer->priv; int avsflags = 0; - mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %f, %d)\n", demuxer, rel_seek_secs, audio_delay, flags); + mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_seek_lavf(%p, %f, %f, %d)\n", + demuxer, rel_seek_secs, audio_delay, flags); if (priv->seek_by_bytes) { int64_t pos = demuxer->filepos; @@ -784,22 +829,20 @@ static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, float audio return; } - if (flags & SEEK_ABSOLUTE) { - priv->last_pts = 0; - } else { - if (rel_seek_secs < 0) avsflags = AVSEEK_FLAG_BACKWARD; - } + if (flags & SEEK_ABSOLUTE) + priv->last_pts = 0; + else if (rel_seek_secs < 0) + avsflags = AVSEEK_FLAG_BACKWARD; if (flags & SEEK_FORWARD) avsflags = 0; else if (flags & SEEK_BACKWARD) avsflags = AVSEEK_FLAG_BACKWARD; if (flags & SEEK_FACTOR) { - if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) - return; - priv->last_pts += rel_seek_secs * priv->avfc->duration; - } else { - priv->last_pts += rel_seek_secs * AV_TIME_BASE; - } + if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) + return; + priv->last_pts += rel_seek_secs * priv->avfc->duration; + } else + priv->last_pts += rel_seek_secs * AV_TIME_BASE; if (av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags) < 0) { avsflags ^= AVSEEK_FLAG_BACKWARD; av_seek_frame(priv->avfc, -1, priv->last_pts, avsflags); @@ -811,8 +854,8 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg) lavf_priv_t *priv = demuxer->priv; switch (cmd) { - case DEMUXER_CTRL_CORRECT_PTS: - return DEMUXER_CTRL_OK; + case DEMUXER_CTRL_CORRECT_PTS: + return DEMUXER_CTRL_OK; case DEMUXER_CTRL_GET_TIME_LENGTH: if (priv->seek_by_bytes) { /* Our bitrate estimate may be better than would be used in @@ -820,195 +863,185 @@ static int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg) if (demuxer->movi_end <= 0) return DEMUXER_CTRL_DONTKNOW; *(double *)arg = (demuxer->movi_end - demuxer->movi_start) * 8 / - priv->bitrate; + priv->bitrate; return DEMUXER_CTRL_GUESS; } - if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) - return DEMUXER_CTRL_DONTKNOW; + if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) + return DEMUXER_CTRL_DONTKNOW; - *((double *)arg) = (double)priv->avfc->duration / AV_TIME_BASE; - return DEMUXER_CTRL_OK; + *((double *)arg) = (double)priv->avfc->duration / AV_TIME_BASE; + return DEMUXER_CTRL_OK; case DEMUXER_CTRL_GET_PERCENT_POS: if (priv->seek_by_bytes) - return DEMUXER_CTRL_DONTKNOW; // let it use the fallback code - if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) - return DEMUXER_CTRL_DONTKNOW; - - *((int *)arg) = (int)((priv->last_pts - priv->avfc->start_time)*100 / priv->avfc->duration); - return DEMUXER_CTRL_OK; - case DEMUXER_CTRL_SWITCH_AUDIO: - case DEMUXER_CTRL_SWITCH_VIDEO: - { - int id = *((int*)arg); - int newid = -2; - int i, curridx = -1; - int nstreams, *pstreams; - demux_stream_t *ds; - - if(cmd == DEMUXER_CTRL_SWITCH_VIDEO) - { - ds = demuxer->video; - nstreams = priv->video_streams; - pstreams = priv->vstreams; - } - else - { - ds = demuxer->audio; - nstreams = priv->audio_streams; - pstreams = priv->astreams; - } - for(i = 0; i < nstreams; i++) - { - if(pstreams[i] == ds->id) //current stream id - { - curridx = i; - break; - } - } - - if (id == -1) { // next track - i = (curridx + 2) % (nstreams + 1) - 1; - if (i >= 0) - newid = pstreams[i]; - } else if (id >= 0 && id < nstreams) { // select track by id - i = id; + return DEMUXER_CTRL_DONTKNOW; // let it use the fallback code + if (priv->avfc->duration == 0 || priv->avfc->duration == AV_NOPTS_VALUE) + return DEMUXER_CTRL_DONTKNOW; + + *((int *)arg) = (int)((priv->last_pts - priv->avfc->start_time) * 100 / + priv->avfc->duration); + return DEMUXER_CTRL_OK; + case DEMUXER_CTRL_SWITCH_AUDIO: + case DEMUXER_CTRL_SWITCH_VIDEO: + { + int id = *((int *)arg); + int newid = -2; + int i, curridx = -1; + int nstreams, *pstreams; + demux_stream_t *ds; + + if (cmd == DEMUXER_CTRL_SWITCH_VIDEO) { + ds = demuxer->video; + nstreams = priv->video_streams; + pstreams = priv->vstreams; + } else { + ds = demuxer->audio; + nstreams = priv->audio_streams; + pstreams = priv->astreams; + } + for (i = 0; i < nstreams; i++) { + if (pstreams[i] == ds->id) { //current stream id + curridx = i; + break; + } + } + + if (id == -1) { // next track + i = (curridx + 2) % (nstreams + 1) - 1; + if (i >= 0) newid = pstreams[i]; - } else // no sound - i = -1; - - if (i == curridx) { - *(int *) arg = curridx < 0 ? -2 : curridx; - return DEMUXER_CTRL_OK; - } else { - ds_free_packs(ds); - if(ds->id >= 0) - priv->avfc->streams[ds->id]->discard = AVDISCARD_ALL; - ds->id = newid; - *(int *) arg = i < 0 ? -2 : i; - if(newid >= 0) - priv->avfc->streams[newid]->discard = AVDISCARD_NONE; - return DEMUXER_CTRL_OK; - } + } else if (id >= 0 && id < nstreams) { // select track by id + i = id; + newid = pstreams[i]; + } else // no sound + i = -1; + + if (i == curridx) { + *(int *) arg = curridx < 0 ? -2 : curridx; + return DEMUXER_CTRL_OK; + } else { + ds_free_packs(ds); + if (ds->id >= 0) + priv->avfc->streams[ds->id]->discard = AVDISCARD_ALL; + ds->id = newid; + *(int *) arg = i < 0 ? -2 : i; + if (newid >= 0) + priv->avfc->streams[newid]->discard = AVDISCARD_NONE; + return DEMUXER_CTRL_OK; } - case DEMUXER_CTRL_IDENTIFY_PROGRAM: - { - demux_program_t *prog = arg; - AVProgram *program; - int p, i; - int start; - - prog->vid = prog->aid = prog->sid = -2; //no audio and no video by default - if(priv->avfc->nb_programs < 1) + } + case DEMUXER_CTRL_IDENTIFY_PROGRAM: + { + demux_program_t *prog = arg; + AVProgram *program; + int p, i; + int start; + + prog->vid = prog->aid = prog->sid = -2; + if (priv->avfc->nb_programs < 1) + return DEMUXER_CTRL_DONTKNOW; + + if (prog->progid == -1) { + p = 0; + while (p < priv->avfc->nb_programs && priv->avfc->programs[p]->id != priv->cur_program) + p++; + p = (p + 1) % priv->avfc->nb_programs; + } else { + for (i = 0; i < priv->avfc->nb_programs; i++) + if (priv->avfc->programs[i]->id == prog->progid) + break; + if (i == priv->avfc->nb_programs) return DEMUXER_CTRL_DONTKNOW; - - if(prog->progid == -1) - { - p = 0; - while(pavfc->nb_programs && priv->avfc->programs[p]->id != priv->cur_program) - p++; - p = (p + 1) % priv->avfc->nb_programs; - } - else - { - for(i=0; iavfc->nb_programs; i++) - if(priv->avfc->programs[i]->id == prog->progid) - break; - if(i==priv->avfc->nb_programs) - return DEMUXER_CTRL_DONTKNOW; - p = i; - } - start = p; + p = i; + } + start = p; redo: - program = priv->avfc->programs[p]; - for(i=0; inb_stream_indexes; i++) - { - switch(priv->avfc->streams[program->stream_index[i]]->codec->codec_type) - { - case AVMEDIA_TYPE_VIDEO: - if(prog->vid == -2) - prog->vid = program->stream_index[i]; - break; - case AVMEDIA_TYPE_AUDIO: - if(prog->aid == -2) - prog->aid = program->stream_index[i]; - break; - case AVMEDIA_TYPE_SUBTITLE: - if(prog->sid == -2 && priv->avfc->streams[program->stream_index[i]]->codec->codec_id == CODEC_ID_TEXT) - prog->sid = program->stream_index[i]; - break; - } - } - if (prog->aid >= 0 && prog->aid < MAX_A_STREAMS && - demuxer->a_streams[prog->aid]) { - sh_audio_t *sh = demuxer->a_streams[prog->aid]; - prog->aid = sh->aid; - } else - prog->aid = -2; - if (prog->vid >= 0 && prog->vid < MAX_V_STREAMS && - demuxer->v_streams[prog->vid]) { - sh_video_t *sh = demuxer->v_streams[prog->vid]; - prog->vid = sh->vid; - } else - prog->vid = -2; - if(prog->progid == -1 && prog->vid == -2 && prog->aid == -2) - { - p = (p + 1) % priv->avfc->nb_programs; - if (p == start) - return DEMUXER_CTRL_DONTKNOW; - goto redo; + program = priv->avfc->programs[p]; + for (i = 0; i < program->nb_stream_indexes; i++) { + switch (priv->avfc->streams[program->stream_index[i]]->codec->codec_type) { + case AVMEDIA_TYPE_VIDEO: + if (prog->vid == -2) + prog->vid = program->stream_index[i]; + break; + case AVMEDIA_TYPE_AUDIO: + if (prog->aid == -2) + prog->aid = program->stream_index[i]; + break; + case AVMEDIA_TYPE_SUBTITLE: + if (prog->sid == -2 && priv->avfc->streams[program->stream_index[i]]->codec->codec_id == CODEC_ID_TEXT) + prog->sid = program->stream_index[i]; + break; } - priv->cur_program = prog->progid = program->id; - return DEMUXER_CTRL_OK; } - default: - return DEMUXER_CTRL_NOTIMPL; + if (prog->aid >= 0 && prog->aid < MAX_A_STREAMS && + demuxer->a_streams[prog->aid]) { + sh_audio_t *sh = demuxer->a_streams[prog->aid]; + prog->aid = sh->aid; + } else + prog->aid = -2; + if (prog->vid >= 0 && prog->vid < MAX_V_STREAMS && + demuxer->v_streams[prog->vid]) { + sh_video_t *sh = demuxer->v_streams[prog->vid]; + prog->vid = sh->vid; + } else + prog->vid = -2; + if (prog->progid == -1 && prog->vid == -2 && prog->aid == -2) { + p = (p + 1) % priv->avfc->nb_programs; + if (p == start) + return DEMUXER_CTRL_DONTKNOW; + goto redo; + } + priv->cur_program = prog->progid = program->id; + return DEMUXER_CTRL_OK; + } + default: + return DEMUXER_CTRL_NOTIMPL; } } static void demux_close_lavf(demuxer_t *demuxer) { - lavf_priv_t* priv = demuxer->priv; - if (priv){ - if(priv->avfc) - { - av_freep(&priv->avfc->key); - av_close_input_stream(priv->avfc); + lavf_priv_t *priv = demuxer->priv; + if (priv) { + if (priv->avfc) { + av_freep(&priv->avfc->key); + av_close_input_stream(priv->avfc); } av_freep(&priv->pb); - free(priv); demuxer->priv= NULL; + free(priv); + demuxer->priv = NULL; } } const demuxer_desc_t demuxer_desc_lavf = { - "libavformat demuxer", - "lavf", - "libavformat", - "Michael Niedermayer", - "supports many formats, requires libavformat", - DEMUXER_TYPE_LAVF, - 0, // Check after other demuxer - lavf_check_file, - demux_lavf_fill_buffer, - demux_open_lavf, - demux_close_lavf, - demux_seek_lavf, - demux_lavf_control + "libavformat demuxer", + "lavf", + "libavformat", + "Michael Niedermayer", + "supports many formats, requires libavformat", + DEMUXER_TYPE_LAVF, + 0, // Check after other demuxer + lavf_check_file, + demux_lavf_fill_buffer, + demux_open_lavf, + demux_close_lavf, + demux_seek_lavf, + demux_lavf_control }; const demuxer_desc_t demuxer_desc_lavf_preferred = { - "libavformat preferred demuxer", - "lavfpref", - "libavformat", - "Michael Niedermayer", - "supports many formats, requires libavformat", - DEMUXER_TYPE_LAVF_PREFERRED, - 1, - lavf_check_preferred_file, - demux_lavf_fill_buffer, - demux_open_lavf, - demux_close_lavf, - demux_seek_lavf, - demux_lavf_control + "libavformat preferred demuxer", + "lavfpref", + "libavformat", + "Michael Niedermayer", + "supports many formats, requires libavformat", + DEMUXER_TYPE_LAVF_PREFERRED, + 1, + lavf_check_preferred_file, + demux_lavf_fill_buffer, + demux_open_lavf, + demux_close_lavf, + demux_seek_lavf, + demux_lavf_control }; diff --git a/m_option.c b/m_option.c index 2fe53f5f17..c0fd8b43b0 100644 --- a/m_option.c +++ b/m_option.c @@ -40,185 +40,204 @@ //#define NO_FREE #endif -const m_option_t* m_option_list_find(const m_option_t* list,const char* name) { - int i; - - for(i = 0 ; list[i].name ; i++) { - int l = strlen(list[i].name) - 1; - if((list[i].type->flags & M_OPT_TYPE_ALLOW_WILDCARD) && - (l > 0) && (list[i].name[l] == '*')) { - if(strncasecmp(list[i].name,name,l) == 0) - return &list[i]; - } else if(strcasecmp(list[i].name,name) == 0) - return &list[i]; - } - return NULL; +const m_option_t *m_option_list_find(const m_option_t *list, const char *name) +{ + int i; + + for (i = 0; list[i].name; i++) { + int l = strlen(list[i].name) - 1; + if ((list[i].type->flags & M_OPT_TYPE_ALLOW_WILDCARD) + && (l > 0) && (list[i].name[l] == '*')) { + if (strncasecmp(list[i].name, name, l) == 0) + return &list[i]; + } else if (strcasecmp(list[i].name, name) == 0) + return &list[i]; + } + return NULL; } // Default function that just does a memcpy -static void copy_opt(const m_option_t* opt,void* dst,const void* src) { - if(dst && src) - memcpy(dst,src,opt->type->size); +static void copy_opt(const m_option_t *opt, void *dst, const void *src) +{ + if (dst && src) + memcpy(dst, src, opt->type->size); } // Helper for the print funcs (from man printf) -static char* dup_printf(const char *fmt, ...) { - /* Guess we need no more than 50 bytes. */ - int n, size = 50; - char *p; - va_list ap; - if ((p = malloc (size)) == NULL) - return NULL; - while (1) { - /* Try to print in the allocated space. */ - va_start(ap, fmt); - n = vsnprintf (p, size, fmt, ap); - va_end(ap); - /* If that worked, return the string. */ - if (n > -1 && n < size) - return p; - /* Else try again with more space. */ - if (n > -1) /* glibc 2.1 */ - size = n+1; /* precisely what is needed */ - else /* glibc 2.0 */ - size *= 2; /* twice the old size */ - if ((p = realloc (p, size)) == NULL) - return NULL; - } +static char *dup_printf(const char *fmt, ...) +{ + /* Guess we need no more than 50 bytes. */ + int n, size = 50; + char *p; + va_list ap; + if ((p = malloc(size)) == NULL) + return NULL; + while (1) { + /* Try to print in the allocated space. */ + va_start(ap, fmt); + n = vsnprintf(p, size, fmt, ap); + va_end(ap); + /* If that worked, return the string. */ + if (n > -1 && n < size) + return p; + /* Else try again with more space. */ + if (n > -1) /* glibc 2.1 */ + size = n + 1; /* precisely what is needed */ + else /* glibc 2.0 */ + size *= 2; /* twice the old size */ + if ((p = realloc(p, size)) == NULL) + return NULL; + } } // Flag -#define VAL(x) (*(int*)(x)) - -static int parse_flag(const m_option_t* opt,const char *name, const char *param, void* dst, int src) { - if (src == M_CONFIG_FILE) { - if(!param) return M_OPT_MISSING_PARAM; - if (!strcasecmp(param, "yes") || /* any other language? */ - !strcasecmp(param, "on") || - !strcasecmp(param, "ja") || - !strcasecmp(param, "si") || - !strcasecmp(param, "igen") || - !strcasecmp(param, "y") || - !strcasecmp(param, "j") || - !strcasecmp(param, "i") || - !strcasecmp(param, "tak") || - !strcasecmp(param, "ja") || - !strcasecmp(param, "true") || - !strcmp(param, "1")) { - if(dst) VAL(dst) = opt->max; - } else if (!strcasecmp(param, "no") || - !strcasecmp(param, "off") || - !strcasecmp(param, "nein") || - !strcasecmp(param, "nicht") || - !strcasecmp(param, "nem") || - !strcasecmp(param, "n") || - !strcasecmp(param, "nie") || - !strcasecmp(param, "nej") || - !strcasecmp(param, "false") || - !strcmp(param, "0")) { - if(dst) VAL(dst) = opt->min; +#define VAL(x) (*(int *)(x)) + +static int parse_flag(const m_option_t *opt, const char *name, + const char *param, void *dst, int src) +{ + if (src == M_CONFIG_FILE) { + if (!param) + return M_OPT_MISSING_PARAM; + if (!strcasecmp(param, "yes") || /* any other language? */ + !strcasecmp(param, "on") || + !strcasecmp(param, "ja") || + !strcasecmp(param, "si") || + !strcasecmp(param, "igen") || + !strcasecmp(param, "y") || + !strcasecmp(param, "j") || + !strcasecmp(param, "i") || + !strcasecmp(param, "tak") || + !strcasecmp(param, "ja") || + !strcasecmp(param, "true") || + !strcmp(param, "1")) { + if (dst) + VAL(dst) = opt->max; + } else if (!strcasecmp(param, "no") || + !strcasecmp(param, "off") || + !strcasecmp(param, "nein") || + !strcasecmp(param, "nicht") || + !strcasecmp(param, "nem") || + !strcasecmp(param, "n") || + !strcasecmp(param, "nie") || + !strcasecmp(param, "nej") || + !strcasecmp(param, "false") || + !strcmp(param, "0")) { + if (dst) + VAL(dst) = opt->min; + } else { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, + "Invalid parameter for %s flag: %s\n", name, param); + return M_OPT_INVALID; + } + return 1; } else { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid parameter for %s flag: %s\n",name, param); - return M_OPT_INVALID; + if (dst) + VAL(dst) = opt->max; + return 0; } - return 1; - } else { - if(dst) VAL(dst) = opt->max; - return 0; - } } -static char* print_flag(const m_option_t* opt, const void* val) { - if(VAL(val) == opt->min) - return strdup("no"); - else - return strdup("yes"); +static char *print_flag(const m_option_t *opt, const void *val) +{ + if (VAL(val) == opt->min) + return strdup("no"); + else + return strdup("yes"); } const m_option_type_t m_option_type_flag = { - "Flag", - "need yes or no in config files", - sizeof(int), - 0, - parse_flag, - print_flag, - copy_opt, - copy_opt, - NULL, - NULL + "Flag", + "need yes or no in config files", + sizeof(int), + 0, + parse_flag, + print_flag, + copy_opt, + copy_opt, + NULL, + NULL }; // Integer -static int parse_int(const m_option_t* opt,const char *name, const char *param, void* dst, int src) { - long long tmp_int; - char *endptr; - src = 0; +static int parse_int(const m_option_t *opt, const char *name, + const char *param, void *dst, int src) +{ + long long tmp_int; + char *endptr; + src = 0; - if (param == NULL) - return M_OPT_MISSING_PARAM; + if (param == NULL) + return M_OPT_MISSING_PARAM; - tmp_int = strtoll(param, &endptr, 10); - if (*endptr) - tmp_int = strtoll(param, &endptr, 0); - if (*endptr) { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be an integer: %s\n",name, param); - return M_OPT_INVALID; - } + tmp_int = strtoll(param, &endptr, 10); + if (*endptr) + tmp_int = strtoll(param, &endptr, 0); + if (*endptr) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, + "The %s option must be an integer: %s\n", name, param); + return M_OPT_INVALID; + } - if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be >= %d: %s\n", name, (int) opt->min, param); - return M_OPT_OUT_OF_RANGE; - } + if ((opt->flags & M_OPT_MIN) && (tmp_int < opt->min)) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, + "The %s option must be >= %d: %s\n", + name, (int) opt->min, param); + return M_OPT_OUT_OF_RANGE; + } - if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) { - mp_msg(MSGT_CFGPARSER, MSGL_ERR, "The %s option must be <= %d: %s\n",name, (int) opt->max, param); - return M_OPT_OUT_OF_RANGE; - } + if ((opt->flags & M_OPT_MAX) && (tmp_int > opt->max)) { + mp_msg(MSGT_CFGPARSER, MSGL_ERR, + "The %s option must be <= %d: %s\n", + name, (int) opt->max, param); + return M_OPT_OUT_OF_RANGE; + } - if(dst) { - if (opt->type->size == sizeof(int64_t)) - *(int64_t *)dst = tmp_int; - else - VAL(dst) = tmp_int; - } + if (dst) { + if (opt->type->size == sizeof(int64_t)) + *(int64_t *)dst = tmp_int; + else + VAL(dst) = tmp_int; + } - return 1; + return 1; } -static char* print_int(const m_option_t* opt, const void* val) { - if (opt->type->size == sizeof(int64_t)) - return dup_printf("%"PRId64, *(const int64_t *)val); - return dup_printf("%d",VAL(val)); +static char *print_int(const m_option_t *opt, const void *val) +{ + if (opt->type->size == sizeof(int64_t)) + return dup_printf("%"PRId64, *(const int64_t *)val); + return dup_printf("%d", VAL(val)); } const m_option_type_t m_option_type_int = { - "Integer", - "", - sizeof(int), - 0, - parse_int, - print_int, - copy_opt, - copy_opt, - NULL, - NULL + "Integer", + "", + sizeof(int), + 0, + parse_int, + print_int, + copy_opt, + copy_opt, + NULL, + NULL }; const m_option_type_t m_option_type_int64 = { - "Integer64", - "", - sizeof(int64_t), - 0, - parse_int, - print_int, - copy_opt, - copy_opt, - NULL, - NULL + "Integer64", + "", + sizeof(int64_t), + 0, + parse_int, + print_int, + copy_opt, + copy_opt, + NULL, + NULL }; static int parse_intpair(const struct m_option *opt, const char *name, @@ -253,7 +272,7 @@ static int parse_intpair(const struct m_option *opt, const char *name, return 1; - bad: +bad: mp_msg(MSGT_CFGPARSER, MSGL_ERR, "Invalid integer range " "specification for option %s: %s\n", name, param); return M_OPT_INVALID; @@ -292,7 +311,7 @@ static int parse_choice(const struct m_option *opt, const char *name, return 1; } -static char *print_choice(const m_option_t *opt, const void *val) +static char *print_choice(const m_option_t *opt, const void *val) { int v = *(int *)val; struct m_opt_choice_alternatives *alt; @@ -314,229 +333,251 @@ const struct m_option_type m_option_type_choice = { // Float #undef VAL -#define VAL(x) (*(double*)(x)) - -stat