Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-03-04 18:49:26 +0400
committerAnton Khirnov <anton@khirnov.net>2012-03-05 21:47:05 +0400
commit27c7ca9c12bb42d5c44d46f24cd970469d0ef55a (patch)
tree919bcdcd0a17451b2d79edc121a4c05f57ffe86e /libavformat/seek.c
parentdcee811505b9f95edad73526d94cabc99331b659 (diff)
lavf: deobfuscate read_frame_internal().
Split off packet parsing into a separate function. Parse full packets at once and store them in a queue, eliminating the need for tracking parsing state in AVStream. The horrible unreadable loop in read_frame_internal() now isn't weirdly ordered and doesn't contain evil gotos, so it should be much easier to understand. compute_pkt_fields() now invents slightly different timestamps for two raw vc1 tests, due to has_b_frames being set a bit later. They shouldn't be more wrong (or right) than previous ones.
Diffstat (limited to 'libavformat/seek.c')
-rw-r--r--libavformat/seek.c17
1 files changed, 4 insertions, 13 deletions
diff --git a/libavformat/seek.c b/libavformat/seek.c
index e64021dc78..524cd87e6a 100644
--- a/libavformat/seek.c
+++ b/libavformat/seek.c
@@ -409,13 +409,13 @@ AVParserState *ff_store_parser_state(AVFormatContext *s)
state->fpos = avio_tell(s->pb);
// copy context structures
- state->cur_st = s->cur_st;
state->packet_buffer = s->packet_buffer;
+ state->parse_queue = s->parse_queue;
state->raw_packet_buffer = s->raw_packet_buffer;
state->raw_packet_buffer_remaining_size = s->raw_packet_buffer_remaining_size;
- s->cur_st = NULL;
s->packet_buffer = NULL;
+ s->parse_queue = NULL;
s->raw_packet_buffer = NULL;
s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
@@ -429,19 +429,13 @@ AVParserState *ff_store_parser_state(AVFormatContext *s)
ss->last_IP_pts = st->last_IP_pts;
ss->cur_dts = st->cur_dts;
ss->reference_dts = st->reference_dts;
- ss->cur_ptr = st->cur_ptr;
- ss->cur_len = st->cur_len;
ss->probe_packets = st->probe_packets;
- ss->cur_pkt = st->cur_pkt;
st->parser = NULL;
st->last_IP_pts = AV_NOPTS_VALUE;
st->cur_dts = AV_NOPTS_VALUE;
st->reference_dts = AV_NOPTS_VALUE;
- st->cur_ptr = NULL;
- st->cur_len = 0;
st->probe_packets = MAX_PROBE_PACKETS;
- av_init_packet(&st->cur_pkt);
}
return state;
@@ -460,8 +454,8 @@ void ff_restore_parser_state(AVFormatContext *s, AVParserState *state)
avio_seek(s->pb, state->fpos, SEEK_SET);
// copy context structures
- s->cur_st = state->cur_st;
s->packet_buffer = state->packet_buffer;
+ s->parse_queue = state->parse_queue;
s->raw_packet_buffer = state->raw_packet_buffer;
s->raw_packet_buffer_remaining_size = state->raw_packet_buffer_remaining_size;
@@ -474,10 +468,7 @@ void ff_restore_parser_state(AVFormatContext *s, AVParserState *state)
st->last_IP_pts = ss->last_IP_pts;
st->cur_dts = ss->cur_dts;
st->reference_dts = ss->reference_dts;
- st->cur_ptr = ss->cur_ptr;
- st->cur_len = ss->cur_len;
st->probe_packets = ss->probe_packets;
- st->cur_pkt = ss->cur_pkt;
}
av_free(state->stream_states);
@@ -507,10 +498,10 @@ void ff_free_parser_state(AVFormatContext *s, AVParserState *state)
ss = &state->stream_states[i];
if (ss->parser)
av_parser_close(ss->parser);
- av_free_packet(&ss->cur_pkt);
}
free_packet_list(state->packet_buffer);
+ free_packet_list(state->parse_queue);
free_packet_list(state->raw_packet_buffer);
av_free(state->stream_states);