|
|
|
@@ -208,6 +208,7 @@ typedef struct { |
|
|
|
uint16_t maximum_packet; |
|
|
|
uint32_t next_packet_number; |
|
|
|
uint16_t next_packet_count; |
|
|
|
uint64_t next_packet_offset; |
|
|
|
int next_start_sec; |
|
|
|
int end_sec; |
|
|
|
} ASFContext; |
|
|
|
@@ -763,7 +764,8 @@ static void put_frame(AVFormatContext *s, ASFStream *stream, AVStream *avst, |
|
|
|
} |
|
|
|
|
|
|
|
static int update_index(AVFormatContext *s, int start_sec, |
|
|
|
uint32_t packet_number, uint16_t packet_count) |
|
|
|
uint32_t packet_number, uint16_t packet_count, |
|
|
|
uint64_t packet_offset) |
|
|
|
{ |
|
|
|
ASFContext *asf = s->priv_data; |
|
|
|
|
|
|
|
@@ -773,6 +775,7 @@ static int update_index(AVFormatContext *s, int start_sec, |
|
|
|
if (!asf->next_start_sec) { |
|
|
|
asf->next_packet_number = packet_number; |
|
|
|
asf->next_packet_count = packet_count; |
|
|
|
asf->next_packet_offset = packet_offset; |
|
|
|
} |
|
|
|
|
|
|
|
if (start_sec > asf->nb_index_memory_alloc) { |
|
|
|
@@ -788,11 +791,15 @@ static int update_index(AVFormatContext *s, int start_sec, |
|
|
|
for (i = asf->next_start_sec; i < start_sec; i++) { |
|
|
|
asf->index_ptr[i].packet_number = asf->next_packet_number; |
|
|
|
asf->index_ptr[i].packet_count = asf->next_packet_count; |
|
|
|
asf->index_ptr[i].send_time = asf->next_start_sec * INT64_C(10000000); |
|
|
|
asf->index_ptr[i].offset = asf->next_packet_offset; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
asf->maximum_packet = FFMAX(asf->maximum_packet, packet_count); |
|
|
|
asf->next_packet_number = packet_number; |
|
|
|
asf->next_packet_count = packet_count; |
|
|
|
asf->next_packet_offset = packet_offset; |
|
|
|
asf->next_start_sec = start_sec; |
|
|
|
|
|
|
|
return 0; |
|
|
|
@@ -801,6 +808,7 @@ static int update_index(AVFormatContext *s, int start_sec, |
|
|
|
static int asf_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
{ |
|
|
|
ASFContext *asf = s->priv_data; |
|
|
|
AVIOContext *pb = s->pb; |
|
|
|
ASFStream *stream; |
|
|
|
AVCodecContext *codec; |
|
|
|
uint32_t packet_number; |
|
|
|
@@ -808,6 +816,7 @@ static int asf_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
int start_sec; |
|
|
|
int flags = pkt->flags; |
|
|
|
int ret; |
|
|
|
uint64_t offset = avio_tell(pb); |
|
|
|
|
|
|
|
codec = s->streams[pkt->stream_index]->codec; |
|
|
|
stream = &asf->streams[pkt->stream_index]; |
|
|
|
@@ -830,7 +839,8 @@ static int asf_write_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
/* check index */ |
|
|
|
if ((!asf->is_streamed) && (flags & AV_PKT_FLAG_KEY)) { |
|
|
|
uint16_t packet_count = asf->nb_packets - packet_number; |
|
|
|
if ((ret = update_index(s, start_sec, packet_number, packet_count)) < 0) |
|
|
|
ret = update_index(s, start_sec, packet_number, packet_count, offset); |
|
|
|
if (ret < 0) |
|
|
|
return ret; |
|
|
|
} |
|
|
|
asf->end_sec = start_sec; |
|
|
|
@@ -871,7 +881,7 @@ static int asf_write_trailer(AVFormatContext *s) |
|
|
|
/* write index */ |
|
|
|
data_size = avio_tell(s->pb); |
|
|
|
if (!asf->is_streamed && asf->next_start_sec) { |
|
|
|
if ((ret = update_index(s, asf->end_sec + 1, 0, 0)) < 0) |
|
|
|
if ((ret = update_index(s, asf->end_sec + 1, 0, 0, 0)) < 0) |
|
|
|
return ret; |
|
|
|
asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->next_start_sec); |
|
|
|
} |
|
|
|
|