mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
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
This commit is contained in:
parent
306eefc49f
commit
c46038f6b7
@ -80,7 +80,6 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t seqno;
|
uint32_t seqno;
|
||||||
unsigned int packet_size;
|
|
||||||
int is_streamed;
|
int is_streamed;
|
||||||
int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID
|
int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID
|
||||||
ASFStream streams[128]; ///< it's max number and it's not that big
|
ASFStream streams[128]; ///< it's max number and it's not that big
|
||||||
|
@ -212,7 +212,7 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
asf->hdr.min_pktsize = get_le32(pb);
|
asf->hdr.min_pktsize = get_le32(pb);
|
||||||
asf->hdr.max_pktsize = get_le32(pb);
|
asf->hdr.max_pktsize = get_le32(pb);
|
||||||
asf->hdr.max_bitrate = 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))) {
|
} else if (!memcmp(&g, &ff_asf_stream_header, sizeof(GUID))) {
|
||||||
enum CodecType type;
|
enum CodecType type;
|
||||||
int type_specific_size, sizeX;
|
int type_specific_size, sizeX;
|
||||||
@ -557,7 +557,7 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb)
|
|||||||
|
|
||||||
off= 32768;
|
off= 32768;
|
||||||
if (s->packet_size > 0)
|
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;
|
c=d=e=-1;
|
||||||
while(off-- > 0){
|
while(off-- > 0){
|
||||||
@ -587,12 +587,12 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb)
|
|||||||
asf->packet_flags = c;
|
asf->packet_flags = c;
|
||||||
asf->packet_property = d;
|
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 >> 1, padsize, 0); // sequence ignored
|
||||||
DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length
|
DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length
|
||||||
|
|
||||||
//the following checks prevent overflows and infinite loops
|
//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));
|
av_log(s, AV_LOG_ERROR, "invalid packet_length %d at:%"PRId64"\n", packet_length, url_ftell(pb));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -616,7 +616,7 @@ int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb)
|
|||||||
if (packet_length < asf->hdr.min_pktsize)
|
if (packet_length < asf->hdr.min_pktsize)
|
||||||
padsize += asf->hdr.min_pktsize - packet_length;
|
padsize += asf->hdr.min_pktsize - packet_length;
|
||||||
asf->packet_padsize = padsize;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -788,7 +788,7 @@ int ff_asf_parse_packet(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt)
|
|||||||
|
|
||||||
/* read data */
|
/* read data */
|
||||||
//printf("READ PACKET s:%d os:%d o:%d,%d l:%d DATA:%p\n",
|
//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_st->frag_offset, asf->packet_frag_size, asf_st->pkt.data);
|
||||||
asf->packet_size_left -= asf->packet_frag_size;
|
asf->packet_size_left -= asf->packet_frag_size;
|
||||||
if (asf->packet_size_left < 0)
|
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)
|
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;
|
AVPacket pkt1, *pkt = &pkt1;
|
||||||
ASFStream *asf_st;
|
ASFStream *asf_st;
|
||||||
int64_t pts;
|
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)
|
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;
|
*ppos= pos;
|
||||||
url_fseek(s->pb, pos, SEEK_SET);
|
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;
|
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;
|
pos= asf_st->packet_pos;
|
||||||
|
|
||||||
av_add_index_entry(s->streams[i], pos, pts, pkt->size, pos - start_pos[i] + 1, AVINDEX_KEYFRAME);
|
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);
|
int pktct =get_le16(s->pb);
|
||||||
av_log(s, AV_LOG_DEBUG, "pktnum:%d, pktct:%d\n", pktnum, pktct);
|
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);
|
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;
|
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;
|
int64_t pos;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
if (asf->packet_size <= 0)
|
if (s->packet_size <= 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Try using the protocol's read_seek if available */
|
/* Try using the protocol's read_seek if available */
|
||||||
|
@ -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, asf->duration); /* duration (in 100ns units) */
|
||||||
put_le64(pb, PREROLL_TIME); /* start time stamp */
|
put_le64(pb, PREROLL_TIME); /* start time stamp */
|
||||||
put_le32(pb, (asf->is_streamed || url_is_streamed(pb)) ? 3 : 2); /* ??? */
|
put_le32(pb, (asf->is_streamed || url_is_streamed(pb)) ? 3 : 2); /* ??? */
|
||||||
put_le32(pb, asf->packet_size); /* packet size */
|
put_le32(pb, s->packet_size); /* packet size */
|
||||||
put_le32(pb, asf->packet_size); /* packet size */
|
put_le32(pb, s->packet_size); /* packet size */
|
||||||
put_le32(pb, bit_rate); /* Nominal data rate in bps */
|
put_le32(pb, bit_rate); /* Nominal data rate in bps */
|
||||||
end_header(pb, hpos);
|
end_header(pb, hpos);
|
||||||
|
|
||||||
@ -514,7 +514,7 @@ static int asf_write_header(AVFormatContext *s)
|
|||||||
{
|
{
|
||||||
ASFContext *asf = s->priv_data;
|
ASFContext *asf = s->priv_data;
|
||||||
|
|
||||||
asf->packet_size = PACKET_SIZE;
|
s->packet_size = PACKET_SIZE;
|
||||||
asf->nb_packets = 0;
|
asf->nb_packets = 0;
|
||||||
|
|
||||||
asf->last_indexed_pts = 0;
|
asf->last_indexed_pts = 0;
|
||||||
@ -536,7 +536,7 @@ static int asf_write_header(AVFormatContext *s)
|
|||||||
asf->packet_nb_payloads = 0;
|
asf->packet_nb_payloads = 0;
|
||||||
asf->packet_timestamp_start = -1;
|
asf->packet_timestamp_start = -1;
|
||||||
asf->packet_timestamp_end = -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);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -612,7 +612,7 @@ static void flush_packet(AVFormatContext *s)
|
|||||||
assert(asf->packet_timestamp_end >= asf->packet_timestamp_start);
|
assert(asf->packet_timestamp_end >= asf->packet_timestamp_start);
|
||||||
|
|
||||||
if (asf->is_streamed) {
|
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(
|
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);
|
assert(packet_hdr_size <= asf->packet_size_left);
|
||||||
memset(asf->packet_buf + packet_filled_size, 0, 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);
|
put_flush_packet(s->pb);
|
||||||
asf->nb_packets++;
|
asf->nb_packets++;
|
||||||
asf->packet_nb_payloads = 0;
|
asf->packet_nb_payloads = 0;
|
||||||
asf->packet_timestamp_start = -1;
|
asf->packet_timestamp_start = -1;
|
||||||
asf->packet_timestamp_end = -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);
|
NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user