[FFmpeg-devel] [PATCH 2/3] avformat: add support to force specific AVCodecs
Michael Niedermayer
michaelni at gmx.at
Sat Sep 28 18:10:49 CEST 2013
previously only codec_ids could be forced, which did not allow
forcing a specific implementation like libopenjpeg vs jpeg2000.
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
libavformat/avformat.h | 30 ++++++++++++++++++++++++++++++
libavformat/utils.c | 15 +++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index b18eb3f..0ab8af6 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -1315,9 +1315,39 @@ typedef struct AVFormatContext {
* Demuxers can use the flag to detect such changes.
*/
int io_repositioned;
+
+ /**
+ * Forced video codec.
+ * This allows forcing a specific decoder, even when there are multiple with
+ * the same codec_id
+ * Demuxing: Set by user via av_format_set_video_codec (NO direct access).
+ */
+ AVCodec *video_codec;
+
+ /**
+ * Forced audio codec.
+ * This allows forcing a specific decoder, even when there are multiple with
+ * the same codec_id
+ * Demuxing: Set by user via av_format_set_audio_codec (NO direct access).
+ */
+ AVCodec *audio_codec;
+
+ /**
+ * Forced subtitle codec.
+ * This allows forcing a specific decoder, even when there are multiple with
+ * the same codec_id
+ * Demuxing: Set by user via av_format_set_subtitle_codec (NO direct access).
+ */
+ AVCodec *subtitle_codec;
} AVFormatContext;
int av_format_get_probe_score(const AVFormatContext *s);
+AVCodec * av_format_get_video_codec(const AVFormatContext *s);
+void av_format_set_video_codec(AVFormatContext *s, AVCodec *c);
+AVCodec * av_format_get_audio_codec(const AVFormatContext *s);
+void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c);
+AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s);
+void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c);
/**
* Returns the method used to set ctx->duration.
diff --git a/libavformat/utils.c b/libavformat/utils.c
index b47787a..61405d7 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -98,12 +98,27 @@ static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
}
MAKE_ACCESSORS(AVStream, stream, AVRational, r_frame_rate)
+MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
+MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
+MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
static AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum AVCodecID codec_id)
{
if (st->codec->codec)
return st->codec->codec;
+ switch(st->codec->codec_type){
+ case AVMEDIA_TYPE_VIDEO:
+ if(s->video_codec) return s->video_codec;
+ break;
+ case AVMEDIA_TYPE_AUDIO:
+ if(s->audio_codec) return s->audio_codec;
+ break;
+ case AVMEDIA_TYPE_SUBTITLE:
+ if(s->subtitle_codec) return s->subtitle_codec;
+ break;
+ }
+
return avcodec_find_decoder(codec_id);
}
--
1.7.9.5
More information about the ffmpeg-devel
mailing list