From 4c2bc159bd56a0e8b387a302f2873271224669fd Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 30 Sep 2002 21:36:43 +0000 Subject: fixing rv10, this isnt the cleanest solution (parsing the packet header in the codec & creating it in the muxer) but it was that way before things broke, and its the simplest solution Originally committed as revision 986 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libav/rm.c | 54 +++++++++++++++++++++++++++++++++++++++------ libavcodec/rv10.c | 11 ++------- tests/ffmpeg.regression.ref | 2 +- 3 files changed, 50 insertions(+), 17 deletions(-) diff --git a/libav/rm.c b/libav/rm.c index c3e2e8c26a..4973fb5280 100644 --- a/libav/rm.c +++ b/libav/rm.c @@ -631,6 +631,21 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap) return -EIO; } +static int get_num(ByteIOContext *pb, int *len) +{ + int n, n1; + + n = get_be16(pb); + (*len)-=2; + if (n >= 0x4000) { + return n - 0x4000; + } else { + n1 = get_be16(pb); + (*len)-=2; + return (n << 16) | n1; + } +} + static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) { RMContext *rm = s->priv_data; @@ -666,19 +681,44 @@ static int rm_read_packet(AVFormatContext *s, AVPacket *pkt) goto redo; } +#if 0 // XXX/FIXME this is done in the codec currently, but should be done here ... if (st->codec.codec_type == CODEC_TYPE_VIDEO) { - get_byte(pb); - get_byte(pb); - get_be16(pb); - get_be16(pb); - get_byte(pb); - len -= 7; + int full_frame, h, pic_num; + + h= get_byte(pb); + if ((h & 0xc0) == 0xc0) { + int len2, pos; + full_frame = 1; + len2= get_num(pb, &len); + pos = get_num(pb, &len); + //printf("pos:%d\n",len); + len -= 2; + } else { + int seq, frame_size, pos; + full_frame = 0; + seq = get_byte(pb); + frame_size = get_num(pb, &len); + pos = get_num(pb, &len); + //printf("seq:%d, size:%d, pos:%d\n",seq,frame_size,pos); + len -= 3; + } + /* picture number */ + pic_num= get_byte(pb); + + av_new_packet(pkt, len+1); + pkt->stream_index = i; + + //XXX/FIXME: is this a good idea? + pkt->data[0]= h; //store header, its needed for decoding + + get_buffer(pb, pkt->data+1, len); } +#endif - av_new_packet(pkt, len); pkt->stream_index = i; get_buffer(pb, pkt->data, len); + /* for AC3, needs to swap bytes */ if (st->codec.codec_id == CODEC_ID_AC3) { ptr = pkt->data; diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index 72a412eb5e..c357d55644 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -223,18 +223,10 @@ int rv_decode_dc(MpegEncContext *s, int n) /* write RV 1.0 compatible frame header */ void rv10_encode_picture_header(MpegEncContext *s, int picture_number) { - int full_frame= 1; + int full_frame= 0; align_put_bits(&s->pb); - if(full_frame){ - put_bits(&s->pb, 8, 0xc0); /* packet header */ - put_bits(&s->pb, 16, 0x4000); /* len */ - put_bits(&s->pb, 16, 0x4000); /* pos */ - } - - put_bits(&s->pb, 8, picture_number&0xFF); - put_bits(&s->pb, 1, 1); /* marker */ put_bits(&s->pb, 1, (s->pict_type == P_TYPE)); @@ -276,6 +268,7 @@ static int rv10_decode_picture_header(MpegEncContext *s) int mb_count, pb_frame, marker, h, full_frame; int pic_num, unk; + //XXX/FIXME this should be done in the demuxer not here /* skip packet header */ h = get_bits(&s->gb, 8); if ((h & 0xc0) == 0xc0) { diff --git a/tests/ffmpeg.regression.ref b/tests/ffmpeg.regression.ref index e13b1b997e..1c99e33328 100644 --- a/tests/ffmpeg.regression.ref +++ b/tests/ffmpeg.regression.ref @@ -17,7 +17,7 @@ f5f44dad09c2d4d16524e539645f693c *./data/a-mpeg4-adv.avi d0f077a3b42367d7432b73c0ddad7438 *./data/out.yuv 2846c8e3d97d7395eb746bfce44e0443 *./data/a-mjpeg.avi 278033451d7a6bfeb8339abbe4228499 *./data/out.yuv -202adaf59c09d703b55fc7dd95eace25 *./data/a-rv10.rm +ccbf683d781fa3cdfa18b618731fc74b *./data/a-rv10.rm c1f6c8ee7a24d8345deddf1a24ca3756 *./data/out.yuv 21f8ff9f1daacd9133683bb4ea0f50a4 *./data/a-mp2.mp2 116d1290ba1b4eb98fdee52e423417b1 *./data/out.wav -- cgit v1.2.3