Commit 99f87799 authored by kostya's avatar kostya

Factor out extradata reading code.

Borrowed from RM demuxer in FFmbc.



git-svn-id: file:///var/local/repositories/ffmpeg/trunk@20821 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent d460d009
...@@ -100,6 +100,20 @@ static void get_str8(ByteIOContext *pb, char *buf, int buf_size) ...@@ -100,6 +100,20 @@ static void get_str8(ByteIOContext *pb, char *buf, int buf_size)
get_strl(pb, buf, buf_size, get_byte(pb)); get_strl(pb, buf, buf_size, get_byte(pb));
} }
static int rm_read_extradata(ByteIOContext *pb, AVCodecContext *avctx, unsigned size)
{
if (size >= 1<<24)
return -1;
avctx->extradata = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
if (!avctx->extradata)
return AVERROR_NOMEM;
avctx->extradata_size = get_buffer(pb, avctx->extradata, size);
memset(avctx->extradata + avctx->extradata_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
if (avctx->extradata_size != size)
return AVERROR(EIO);
return 0;
}
static void rm_read_metadata(AVFormatContext *s, int wide) static void rm_read_metadata(AVFormatContext *s, int wide)
{ {
char buf[1024]; char buf[1024];
...@@ -128,6 +142,7 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb, ...@@ -128,6 +142,7 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
{ {
char buf[256]; char buf[256];
uint32_t version; uint32_t version;
int ret;
/* ra type header */ /* ra type header */
version = get_be16(pb); /* version */ version = get_be16(pb); /* version */
...@@ -230,9 +245,8 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb, ...@@ -230,9 +245,8 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
} }
st->codec->block_align = ast->sub_packet_size; st->codec->block_align = ast->sub_packet_size;
} }
st->codec->extradata_size= codecdata_length; if ((ret = rm_read_extradata(s->pb, st->codec, codecdata_length)) < 0)
st->codec->extradata= av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); return ret;
get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
if(ast->audio_framesize >= UINT_MAX / sub_packet_h){ if(ast->audio_framesize >= UINT_MAX / sub_packet_h){
av_log(s, AV_LOG_ERROR, "rm->audio_framesize * sub_packet_h too large\n"); av_log(s, AV_LOG_ERROR, "rm->audio_framesize * sub_packet_h too large\n");
...@@ -252,10 +266,9 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb, ...@@ -252,10 +266,9 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb,
return -1; return -1;
} }
if (codecdata_length >= 1) { if (codecdata_length >= 1) {
st->codec->extradata_size = codecdata_length - 1;
st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
get_byte(pb); get_byte(pb);
get_buffer(pb, st->codec->extradata, st->codec->extradata_size); if ((ret = rm_read_extradata(s->pb, st->codec, codecdata_length - 1)) < 0)
return ret;
} }
break; break;
default: default:
...@@ -278,6 +291,7 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, ByteIOContext *pb, ...@@ -278,6 +291,7 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, ByteIOContext *pb,
unsigned int v; unsigned int v;
int size; int size;
int64_t codec_pos; int64_t codec_pos;
int ret;
av_set_pts_info(st, 64, 1, 1000); av_set_pts_info(st, 64, 1, 1000);
codec_pos = url_ftell(pb); codec_pos = url_ftell(pb);
...@@ -307,17 +321,8 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, ByteIOContext *pb, ...@@ -307,17 +321,8 @@ ff_rm_read_mdpr_codecdata (AVFormatContext *s, ByteIOContext *pb,
fps2= get_be16(pb); fps2= get_be16(pb);
get_be16(pb); get_be16(pb);
st->codec->extradata_size= codec_data_size - (url_ftell(pb) - codec_pos); if ((ret = rm_read_extradata(s->pb, st->codec, codec_data_size - (url_ftell(pb) - codec_pos))) < 0)
return ret;
if(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE <= (unsigned)st->codec->extradata_size){
//check is redundant as get_buffer() will catch this
av_log(s, AV_LOG_ERROR, "st->codec->extradata_size too large\n");
return -1;
}
st->codec->extradata= av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
if (!st->codec->extradata)
return AVERROR(ENOMEM);
get_buffer(pb, st->codec->extradata, st->codec->extradata_size);
// 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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment