From c46038f6b78133f1d7b23100f41784bb7fdbbcac Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Tue, 2 Mar 2010 16:03:06 +0000 Subject: fix 'seektest' again backport r19270 by rbultje: Remove any reference to ASFContext.packet_size and replace it with AVFormatContext.packet_size. See "[PATCH] asf*.c/h: use AVFormatContext->packet_size instead of own copy" thread on ML. and r19361 by reimar: Check for packet_length 0, it is already treated as invalid by the padding check, but that resulted in a confusing/wrong error message. Originally committed as revision 22147 to svn://svn.ffmpeg.org/ffmpeg/branches/0.5 --- libavformat/asf.h | 1 - libavformat/asfdec.c | 23 +++++++++++------------ libavformat/asfenc.c | 14 +++++++------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/libavformat/asf.h b/libavformat/asf.h index a36013bdd2..7e7225cae7 100644 --- a/libavformat/asf.h +++ b/libavformat/asf.h @@ -80,7 +80,6 @@ typedef struct { typedef struct { uint32_t seqno; - unsigned int packet_size; int is_streamed; int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID ASFStream streams[128]; ///< it's max number and it's not that big diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c index cb695c1a44..074266bb1c 100644 --- a/libavformat/asfdec.c +++ b/libavformat/asfdec.c @@ -212,7 +212,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap) asf->hdr.min_pktsize = get_le32(pb); asf->hdr.max_pktsize = get_le32(pb); asf->hdr.max_bitrate = get_le32(pb); - asf->packet_size = asf->hdr.max_pktsize; + s->packet_size = asf->hdr.max_pktsize; } else if (!memcmp(&g, &ff_asf_stream_header, sizeof(GUID))) { enum CodecType type; int type_specific_size, sizeX; @@ -557,7 +557,7 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb) off= 32768; if (s->packet_size > 0) - off= (url_ftell(pb) - s->data_offset) % asf->packet_size + 3; + off= (url_ftell(pb) - s->data_offset) % s->packet_size + 3; c=d=e=-1; while(off-- > 0){ @@ -587,12 +587,12 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb) asf->packet_flags = c; asf->packet_property = d; - DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size); + DO_2BITS(asf->packet_flags >> 5, packet_length, s->packet_size); DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length //the following checks prevent overflows and infinite loops - if(packet_length >= (1U<<29)){ + if(!packet_length || packet_length >= (1U<<29)){ av_log(s, AV_LOG_ERROR, "invalid packet_length %d at:%"PRId64"\n", packet_length, url_ftell(pb)); return -1; } @@ -616,7 +616,7 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb) if (packet_length < asf->hdr.min_pktsize) padsize += asf->hdr.min_pktsize - packet_length; asf->packet_padsize = padsize; - dprintf(s, "packet: size=%d padsize=%d left=%d\n", asf->packet_size, asf->packet_padsize, asf->packet_size_left); + dprintf(s, "packet: size=%d padsize=%d left=%d\n", s->packet_size, asf->packet_padsize, asf->packet_size_left); return 0; } @@ -788,7 +788,7 @@ int ff_asf_parse_packet(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt) /* read data */ //printf("READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n", - // asf->packet_size, asf_st->pkt.size, asf->packet_frag_offset, + // s->packet_size, asf_st->pkt.size, asf->packet_frag_offset, // asf_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data); asf->packet_size_left -= asf->packet_frag_size; if (asf->packet_size_left < 0) @@ -931,7 +931,6 @@ static int asf_read_close(AVFormatContext *s) static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos, int64_t pos_limit) { - ASFContext *asf = s->priv_data; AVPacket pkt1, *pkt = &pkt1; ASFStream *asf_st; int64_t pts; @@ -944,7 +943,7 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos, } if (s->packet_size > 0) - pos= (pos+asf->packet_size-1-s->data_offset)/asf->packet_size*asf->packet_size+ s->data_offset; + pos= (pos+s->packet_size-1-s->data_offset)/s->packet_size*s->packet_size+ s->data_offset; *ppos= pos; url_fseek(s->pb, pos, SEEK_SET); @@ -964,7 +963,7 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index, int64_t *ppos, asf_st= s->streams[i]->priv_data; -// assert((asf_st->packet_pos - s->data_offset) % asf->packet_size == 0); +// assert((asf_st->packet_pos - s->data_offset) % s->packet_size == 0); pos= asf_st->packet_pos; av_add_index_entry(s->streams[i], pos, pts, pkt->size, pos - start_pos[i] + 1, AVINDEX_KEYFRAME); @@ -1007,10 +1006,10 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index) int pktct =get_le16(s->pb); av_log(s, AV_LOG_DEBUG, "pktnum:%d, pktct:%d\n", pktnum, pktct); - pos=s->data_offset + asf->packet_size*(int64_t)pktnum; + pos=s->data_offset + s->packet_size*(int64_t)pktnum; index_pts=av_rescale(itime, i, 10000); - av_add_index_entry(s->streams[stream_index], pos, index_pts, asf->packet_size, 0, AVINDEX_KEYFRAME); + av_add_index_entry(s->streams[stream_index], pos, index_pts, s->packet_size, 0, AVINDEX_KEYFRAME); } asf->index_read= 1; } @@ -1024,7 +1023,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index, int64_t pts, int int64_t pos; int index; - if (asf->packet_size <= 0) + if (s->packet_size <= 0) return -1; /* Try using the protocol's read_seek if available */ diff --git a/libavformat/asfenc.c b/libavformat/asfenc.c index 8c5aec738f..8b33071e8b 100644 --- a/libavformat/asfenc.c +++ b/libavformat/asfenc.c @@ -321,8 +321,8 @@ static int asf_write_header1(AVFormatContext *s, int64_t file_size, int64_t data put_le64(pb, asf->duration); /* duration (in 100ns units) */ put_le64(pb, PREROLL_TIME); /* start time stamp */ put_le32(pb, (asf->is_streamed || url_is_streamed(pb)) ? 3 : 2); /* ??? */ - put_le32(pb, asf->packet_size); /* packet size */ - put_le32(pb, asf->packet_size); /* packet size */ + put_le32(pb, s->packet_size); /* packet size */ + put_le32(pb, s->packet_size); /* packet size */ put_le32(pb, bit_rate); /* Nominal data rate in bps */ end_header(pb, hpos); @@ -514,7 +514,7 @@ static int asf_write_header(AVFormatContext *s) { ASFContext *asf = s->priv_data; - asf->packet_size = PACKET_SIZE; + s->packet_size = PACKET_SIZE; asf->nb_packets = 0; asf->last_indexed_pts = 0; @@ -536,7 +536,7 @@ static int asf_write_header(AVFormatContext *s) asf->packet_nb_payloads = 0; asf->packet_timestamp_start = -1; asf->packet_timestamp_end = -1; - init_put_byte(&asf->pb, asf->packet_buf, asf->packet_size, 1, + init_put_byte(&asf->pb, asf->packet_buf, s->packet_size, 1, NULL, NULL, NULL, NULL); return 0; @@ -612,7 +612,7 @@ static void flush_packet(AVFormatContext *s) assert(asf->packet_timestamp_end >= asf->packet_timestamp_start); if (asf->is_streamed) { - put_chunk(s, 0x4424, asf->packet_size, 0); + put_chunk(s, 0x4424, s->packet_size, 0); } packet_hdr_size = put_payload_parsing_info( @@ -627,14 +627,14 @@ static void flush_packet(AVFormatContext *s) assert(packet_hdr_size <= asf->packet_size_left); memset(asf->packet_buf + packet_filled_size, 0, asf->packet_size_left); - put_buffer(s->pb, asf->packet_buf, asf->packet_size - packet_hdr_size); + put_buffer(s->pb, asf->packet_buf, s->packet_size - packet_hdr_size); put_flush_packet(s->pb); asf->nb_packets++; asf->packet_nb_payloads = 0; asf->packet_timestamp_start = -1; asf->packet_timestamp_end = -1; - init_put_byte(&asf->pb, asf->packet_buf, asf->packet_size, 1, + init_put_byte(&asf->pb, asf->packet_buf, s->packet_size, 1, NULL, NULL, NULL, NULL); } -- cgit v1.2.3