diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index a8aa16e786..61b0d3f3b3 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -100,6 +100,9 @@ enum CodecID { CODEC_ID_PGMYUV, CODEC_ID_PAM, CODEC_ID_FFVHUFF, + CODEC_ID_RV30, + CODEC_ID_RV40, + /* various pcm "codecs" */ CODEC_ID_PCM_S16LE= 0x10000, @@ -1884,6 +1887,8 @@ extern AVCodec h263i_decoder; extern AVCodec flv_decoder; extern AVCodec rv10_decoder; extern AVCodec rv20_decoder; +extern AVCodec rv30_decoder; +extern AVCodec rv40_decoder; extern AVCodec svq1_decoder; extern AVCodec svq3_decoder; extern AVCodec dvvideo_decoder; diff --git a/libavformat/rm.c b/libavformat/rm.c index 54ffa028d8..f0529d0438 100644 --- a/libavformat/rm.c +++ b/libavformat/rm.c @@ -652,7 +652,9 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap) st->codec.codec_tag = get_le32(pb); // av_log(NULL, AV_LOG_DEBUG, "%X %X\n", st->codec.codec_tag, MKTAG('R', 'V', '2', '0')); if ( st->codec.codec_tag != MKTAG('R', 'V', '1', '0') - && st->codec.codec_tag != MKTAG('R', 'V', '2', '0')) + && st->codec.codec_tag != MKTAG('R', 'V', '2', '0') + && st->codec.codec_tag != MKTAG('R', 'V', '3', '0') + && st->codec.codec_tag != MKTAG('R', 'V', '4', '0')) goto fail1; st->codec.width = get_be16(pb); st->codec.height = get_be16(pb); @@ -676,10 +678,13 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap) h263_hack_version = bswap_32(((uint32_t*)st->codec.extradata)[1]); #endif st->codec.sub_id = h263_hack_version; - if((h263_hack_version>>28)==1) - st->codec.codec_id = CODEC_ID_RV10; - else - st->codec.codec_id = CODEC_ID_RV20; + switch((h263_hack_version>>28)){ + case 1: st->codec.codec_id = CODEC_ID_RV10; break; + case 2: st->codec.codec_id = CODEC_ID_RV20; break; + case 3: st->codec.codec_id = CODEC_ID_RV30; break; + case 4: st->codec.codec_id = CODEC_ID_RV40; break; + default: goto fail1; + } } skip: /* skip codec info */