mirror of https://git.videolan.org/git/ffmpeg.git
Make RM demuxer look more like proper demuxer by introducing codec tags
instead of many strcmp() on always four-byte strings. Idea borrowed from RM demuxer in FFmbc by Baptiste Coudurier. Originally committed as revision 20819 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
851ef8755b
commit
461ef74116
|
@ -22,6 +22,7 @@
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
#include "libavutil/intreadwrite.h"
|
#include "libavutil/intreadwrite.h"
|
||||||
#include "avformat.h"
|
#include "avformat.h"
|
||||||
|
#include "riff.h"
|
||||||
#include "rm.h"
|
#include "rm.h"
|
||||||
|
|
||||||
struct RMStream {
|
struct RMStream {
|
||||||
|
@ -48,6 +49,23 @@ typedef struct {
|
||||||
int audio_pkt_cnt; ///< Output packet counter
|
int audio_pkt_cnt; ///< Output packet counter
|
||||||
} RMDemuxContext;
|
} RMDemuxContext;
|
||||||
|
|
||||||
|
static const AVCodecTag rm_codec_tags[] = {
|
||||||
|
{ CODEC_ID_RV10, MKTAG('R','V','1','0') },
|
||||||
|
{ CODEC_ID_RV20, MKTAG('R','V','2','0') },
|
||||||
|
{ CODEC_ID_RV20, MKTAG('R','V','T','R') },
|
||||||
|
{ CODEC_ID_RV30, MKTAG('R','V','3','0') },
|
||||||
|
{ CODEC_ID_RV40, MKTAG('R','V','4','0') },
|
||||||
|
{ CODEC_ID_AC3, MKTAG('d','n','e','t') },
|
||||||
|
{ CODEC_ID_RA_144, MKTAG('l','p','c','J') },
|
||||||
|
{ CODEC_ID_RA_288, MKTAG('2','8','_','8') },
|
||||||
|
{ CODEC_ID_COOK, MKTAG('c','o','o','k') },
|
||||||
|
{ CODEC_ID_ATRAC3, MKTAG('a','t','r','c') },
|
||||||
|
{ CODEC_ID_SIPR, MKTAG('s','i','p','r') },
|
||||||
|
{ CODEC_ID_AAC, MKTAG('r','a','a','c') },
|
||||||
|
{ CODEC_ID_AAC, MKTAG('r','a','c','p') },
|
||||||
|
{ 0 },
|
||||||
|
};
|
||||||
|
|
||||||
static const unsigned char sipr_swaps[38][2] = {
|
static const unsigned char sipr_swaps[38][2] = {
|
||||||
{ 0, 63 }, { 1, 22 }, { 2, 44 }, { 3, 90 },
|
{ 0, 63 }, { 1, 22 }, { 2, 44 }, { 3, 90 },
|
||||||
{ 5, 81 }, { 7, 31 }, { 8, 86 }, { 9, 58 },
|
{ 5, 81 }, { 7, 31 }, { 8, 86 }, { 9, 58 },
|
||||||
|
@ -161,11 +179,13 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
|
||||||
get_str8(pb, buf, sizeof(buf)); /* desc */
|
get_str8(pb, buf, sizeof(buf)); /* desc */
|
||||||
}
|
}
|
||||||
st->codec->codec_type = CODEC_TYPE_AUDIO;
|
st->codec->codec_type = CODEC_TYPE_AUDIO;
|
||||||
if (!strcmp(buf, "dnet")) {
|
st->codec->codec_tag = AV_RL32(buf);
|
||||||
st->codec->codec_id = CODEC_ID_AC3;
|
st->codec->codec_id = ff_codec_get_id(rm_codec_tags, st->codec->codec_tag);
|
||||||
|
switch (st->codec->codec_id) {
|
||||||
|
case CODEC_ID_AC3:
|
||||||
st->need_parsing = AVSTREAM_PARSE_FULL;
|
st->need_parsing = AVSTREAM_PARSE_FULL;
|
||||||
} else if (!strcmp(buf, "28_8")) {
|
break;
|
||||||
st->codec->codec_id = CODEC_ID_RA_288;
|
case CODEC_ID_RA_288:
|
||||||
st->codec->extradata_size= 0;
|
st->codec->extradata_size= 0;
|
||||||
ast->audio_framesize = st->codec->block_align;
|
ast->audio_framesize = st->codec->block_align;
|
||||||
st->codec->block_align = coded_framesize;
|
st->codec->block_align = coded_framesize;
|
||||||
|
@ -176,7 +196,10 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
|
||||||
}
|
}
|
||||||
|
|
||||||
av_new_packet(&ast->pkt, ast->audio_framesize * sub_packet_h);
|
av_new_packet(&ast->pkt, ast->audio_framesize * sub_packet_h);
|
||||||
} else if ((!strcmp(buf, "cook")) || (!strcmp(buf, "atrc")) || (!strcmp(buf, "sipr"))) {
|
break;
|
||||||
|
case CODEC_ID_COOK:
|
||||||
|
case CODEC_ID_ATRAC3:
|
||||||
|
case CODEC_ID_SIPR:
|
||||||
get_be16(pb); get_byte(pb);
|
get_be16(pb); get_byte(pb);
|
||||||
if (((version >> 16) & 0xff) == 5)
|
if (((version >> 16) & 0xff) == 5)
|
||||||
get_byte(pb);
|
get_byte(pb);
|
||||||
|
@ -215,7 +238,8 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
|
||||||
}
|
}
|
||||||
|
|
||||||
av_new_packet(&ast->pkt, ast->audio_framesize * sub_packet_h);
|
av_new_packet(&ast->pkt, ast->audio_framesize * sub_packet_h);
|
||||||
} else if (!strcmp(buf, "raac") || !strcmp(buf, "racp")) {
|
break;
|
||||||
|
case CODEC_ID_AAC:
|
||||||
get_be16(pb); get_byte(pb);
|
get_be16(pb); get_byte(pb);
|
||||||
if (((version >> 16) & 0xff) == 5)
|
if (((version >> 16) & 0xff) == 5)
|
||||||
get_byte(pb);
|
get_byte(pb);
|
||||||
|
@ -231,8 +255,8 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
|
||||||
get_byte(pb);
|
get_byte(pb);
|
||||||
get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
|
get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
|
||||||
}
|
}
|
||||||
} else {
|
break;
|
||||||
st->codec->codec_id = CODEC_ID_NONE;
|
default:
|
||||||
av_strlcpy(st->codec->codec_name, buf, sizeof(st->codec->codec_name));
|
av_strlcpy(st->codec->codec_name, buf, sizeof(st->codec->codec_name));
|
||||||
}
|
}
|
||||||
if (read_all) {
|
if (read_all) {
|
||||||
|
@ -268,12 +292,9 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, ByteIOContext *pb,
|
||||||
goto skip;
|
goto skip;
|
||||||
}
|
}
|
||||||
st->codec->codec_tag = get_le32(pb);
|
st->codec->codec_tag = get_le32(pb);
|
||||||
|
st->codec->codec_id = ff_codec_get_id(rm_codec_tags, st->codec->codec_tag);
|
||||||
// av_log(s, AV_LOG_DEBUG, "%X %X\n", st->codec->codec_tag, MKTAG('R', 'V', '2', '0'));
|
// av_log(s, 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')
|
if (st->codec->codec_id == CODEC_ID_NONE)
|
||||||
&& 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')
|
|
||||||
&& st->codec->codec_tag != MKTAG('R', 'V', 'T', 'R'))
|
|
||||||
goto fail1;
|
goto fail1;
|
||||||
st->codec->width = get_be16(pb);
|
st->codec->width = get_be16(pb);
|
||||||
st->codec->height = get_be16(pb);
|
st->codec->height = get_be16(pb);
|
||||||
|
@ -298,6 +319,7 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, ByteIOContext *pb,
|
||||||
|
|
||||||
// av_log(s, AV_LOG_DEBUG, "fps= %d fps2= %d\n", fps, fps2);
|
// av_log(s, AV_LOG_DEBUG, "fps= %d fps2= %d\n", fps, fps2);
|
||||||
st->codec->time_base.den = fps * st->codec->time_base.num;
|
st->codec->time_base.den = fps * st->codec->time_base.num;
|
||||||
|
//XXX: do we really need that?
|
||||||
switch(((uint8_t*)st->codec->extradata)[4]>>4){
|
switch(((uint8_t*)st->codec->extradata)[4]>>4){
|
||||||
case 1: st->codec->codec_id = CODEC_ID_RV10; break;
|
case 1: st->codec->codec_id = CODEC_ID_RV10; break;
|
||||||
case 2: st->codec->codec_id = CODEC_ID_RV20; break;
|
case 2: st->codec->codec_id = CODEC_ID_RV20; break;
|
||||||
|
|
Loading…
Reference in New Issue