[FFmpeg-devel] [PATCH] rl2 format demuxer
Michael Niedermayer
michaelni
Sun Mar 16 22:56:23 CET 2008
On Sun, Mar 16, 2008 at 03:21:15PM +0100, Sascha Sommer wrote:
[...]
> +/**
> + * read rl2 header data and setup the avstreams
> + * @param s demuxer context
> + * @param ap format parameters
> + * @return 0 on success, AVERROR otherwise
> + */
> +static int rl2_read_header(AVFormatContext *s,
> + AVFormatParameters *ap)
> +{
> + ByteIOContext *pb = s->pb;
> + AVStream *st;
> + unsigned int frame_count;
> + unsigned int audio_frame_counter = 0;
> + unsigned int video_frame_counter = 0;
> + unsigned int back_size;
> + int data_size;
> + unsigned short encoding_method;
> + unsigned short sound_rate;
> + unsigned short rate;
> + unsigned short channels;
> + unsigned short def_sound_size;
> + unsigned int signature;
> + unsigned int pts_den = 11025; /* video only case */
> + unsigned int pts_num = 1103;
> + unsigned int* chunk_offset;
> + int* chunk_size;
> + int* audio_size;
> + int i;
> + int ret = 0;
> +
trailing whitespace ...
[...]
> + chunk_size = av_malloc(frame_count * sizeof(uint32_t));
> + audio_size = av_malloc(frame_count * sizeof(uint32_t));
> + chunk_offset = av_malloc(frame_count * sizeof(uint32_t));
> +
> + if(!chunk_size || !audio_size || !chunk_offset)
> + return AVERROR(ENOMEM);
memleak
> +
> + /** read offset and size tables */
> + for(i=0; i < frame_count;i++)
> + chunk_size[i] = get_le32(pb);
> + for(i=0; i < frame_count;i++)
> + chunk_offset[i] = get_le32(pb);
> + for(i=0; i < frame_count;i++)
> + audio_size[i] = get_le32(pb) & 0xFFFF;
> +
> + /** build the sample index */
> + for(i=0;i<frame_count;i++){
> + if(audio_size[i] < 0 || chunk_size[i] < 0 ||
> + audio_size[i] > chunk_size[i]){
> + ret = AVERROR_INVALIDDATA;
> + break;
> + }
audio_size[i] < 0 is impossible
[...]
> + int stream_id = -1;
> +
> + /** check if there is a valid video entry that can be used */
> + if(rl2->index_pos[0] < s->streams[0]->nb_index_entries)
> + stream_id = 0;
> +
> + /** check if there is a valid audio entry that can be used */
> + if(s->nb_streams && rl2->index_pos[1] < s->streams[1]->nb_index_entries){
> + /** prefer the entry with the lowest position */
> + if(!stream_id){
> + stream_id = s->streams[0]->index_entries[ rl2->index_pos[0] ].pos >
> + s->streams[1]->index_entries[ rl2->index_pos[1] ].pos;
> + }else
> + stream_id = 1;
> + }
s->nb_streams should be 1 or 2 so the check is not too usefull.
pos= INT64_MAX;
for(i=0; i<s->nb_streams; i++){
if( rl2->index_pos[i] < s->streams[i]->nb_index_entries
&& s->streams[i]->index_entries[ rl2->index_pos[i] ].pos < pos){
sample = &s->streams[i]->index_entries[ rl2->index_pos[i] ];
pos= sample->pos;
stream_id= i;
}
}
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
No great genius has ever existed without some touch of madness. -- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080316/fff18a50/attachment.pgp>
More information about the ffmpeg-devel
mailing list