Factor out extradata reading code.
Borrowed from RM demuxer in FFmbc. Originally committed as revision 20821 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									119c61a30f
								
							
						
					
					
						commit
						0dae3e13e3
					
				@ -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,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    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,
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                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,
 | 
				
			|||||||
                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,
 | 
				
			|||||||
    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,
 | 
				
			|||||||
        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;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user