OSDN Git Service

Allow overriding codec_ids.
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 19 Dec 2007 10:56:17 +0000 (10:56 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 19 Dec 2007 10:56:17 +0000 (10:56 +0000)
Originally committed as revision 11266 to svn://svn.ffmpeg.org/ffmpeg/trunk

ffmpeg.c
libavformat/avformat.h
libavformat/utils.c

index ad97836..1fbae5e 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -2662,6 +2662,11 @@ static void opt_input_file(const char *filename)
         if(str && (opt->flags & AV_OPT_FLAG_DECODING_PARAM))
             av_set_string(ic, opt_names[i], str);
     }
+
+    ic->video_codec_id   = find_codec_or_die(video_codec_name   , CODEC_TYPE_VIDEO   , 0);
+    ic->audio_codec_id   = find_codec_or_die(audio_codec_name   , CODEC_TYPE_AUDIO   , 0);
+    ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 0);
+
     /* open the input file with generic libav function */
     err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
     if (err < 0) {
index ad8dc7d..27d3c00 100644 (file)
@@ -445,6 +445,22 @@ typedef struct AVFormatContext {
 
     unsigned int nb_programs;
     AVProgram **programs;
+
+    /**
+     * Forced video codec_id.
+     * demuxing: set by user
+     */
+    enum CodecID video_codec_id;
+    /**
+     * Forced audio codec_id.
+     * demuxing: set by user
+     */
+    enum CodecID audio_codec_id;
+    /**
+     * Forced subtitle codec_id.
+     * demuxing: set by user
+     */
+    enum CodecID subtitle_codec_id;
 } AVFormatContext;
 
 typedef struct AVPacketList {
index 1a34049..386fe60 100644 (file)
@@ -493,8 +493,25 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
 
 int av_read_packet(AVFormatContext *s, AVPacket *pkt)
 {
+    int ret;
+    AVStream *st;
     av_init_packet(pkt);
-    return s->iformat->read_packet(s, pkt);
+    ret= s->iformat->read_packet(s, pkt);
+    st= s->streams[pkt->stream_index];
+
+    switch(st->codec->codec_type){
+    case CODEC_TYPE_VIDEO:
+        if(s->video_codec_id)   st->codec->codec_id= s->video_codec_id;
+        break;
+    case CODEC_TYPE_AUDIO:
+        if(s->audio_codec_id)   st->codec->codec_id= s->audio_codec_id;
+        break;
+    case CODEC_TYPE_SUBTITLE:
+        if(s->subtitle_codec_id)st->codec->codec_id= s->subtitle_codec_id;
+        break;
+    }
+
+    return ret;
 }
 
 /**********************************************************/