From b91a98ed44fc57397fa876e3e329085ac61bc1db Mon Sep 17 00:00:00 2001 From: John Bradley Date: Thu, 19 Mar 2015 11:00:42 -0500 Subject: [PATCH] deps-libff: Refactor AVPacket into ff_packet This also replaces AVPacketList with ff_packet_list. --- deps/libff/libff/ff-audio-decoder.c | 33 ++++++++++++++++------------- deps/libff/libff/ff-decoder.c | 4 ++-- deps/libff/libff/ff-decoder.h | 2 +- deps/libff/libff/ff-demuxer.c | 6 +++--- deps/libff/libff/ff-packet-queue.c | 32 +++++++++++++++------------- deps/libff/libff/ff-packet-queue.h | 20 ++++++++++++----- deps/libff/libff/ff-video-decoder.c | 8 +++---- 7 files changed, 60 insertions(+), 45 deletions(-) diff --git a/deps/libff/libff/ff-audio-decoder.c b/deps/libff/libff/ff-audio-decoder.c index b3ebe28e1..b31a6633d 100644 --- a/deps/libff/libff/ff-audio-decoder.c +++ b/deps/libff/libff/ff-audio-decoder.c @@ -28,29 +28,30 @@ #include -static inline void shrink_packet(AVPacket *packet, int packet_length) +static inline void shrink_packet(struct ff_packet *packet, int packet_length) { - if (packet_length <= packet->size) { - int remaining = packet->size - packet_length; + if (packet_length <= packet->base.size) { + int remaining = packet->base.size - packet_length; - memmove(packet->data, &packet->data[packet_length], remaining); - av_shrink_packet(packet, remaining); + memmove(packet->base.data, &packet->base.data[packet_length], + remaining); + av_shrink_packet(&packet->base, remaining); } } static int decode_frame(struct ff_decoder *decoder, - AVPacket *packet, AVFrame *frame, bool *frame_complete) + struct ff_packet *packet, AVFrame *frame, bool *frame_complete) { int packet_length; int ret; while (true) { - while (packet->size > 0) { + while (packet->base.size > 0) { int complete; packet_length = avcodec_decode_audio4(decoder->codec, frame, &complete, - packet); + &packet->base); if (packet_length < 0) break; @@ -66,15 +67,16 @@ static int decode_frame(struct ff_decoder *decoder, av_get_bytes_per_sample(frame->format); } - if (packet->data != NULL) - av_packet_unref(packet); + if (packet->base.data != NULL) + av_packet_unref(&packet->base); ret = packet_queue_get(&decoder->packet_queue, packet, 1); if (ret == FF_PACKET_FAIL) { return -1; } - if (packet->data == decoder->packet_queue.flush_packet.data) { + if (packet->base.data == + decoder->packet_queue.flush_packet.base.data) { avcodec_flush_buffers(decoder->codec); // we were flushed, so try to get another packet @@ -126,13 +128,14 @@ void *ff_audio_decoder_thread(void *opaque_audio_decoder) { struct ff_decoder *decoder = opaque_audio_decoder; - AVPacket packet = {0}; + struct ff_packet packet = {0}; bool frame_complete; AVFrame *frame = av_frame_alloc(); while (!decoder->abort) { - if (decode_frame(decoder, &packet, frame, &frame_complete) < 0) { - av_free_packet(&packet); + if (decode_frame(decoder, &packet, frame, &frame_complete) + < 0) { + av_free_packet(&packet.base); continue; } @@ -148,7 +151,7 @@ void *ff_audio_decoder_thread(void *opaque_audio_decoder) av_frame_unref(frame); } - av_free_packet(&packet); + av_free_packet(&packet.base); } av_frame_free(&frame); diff --git a/deps/libff/libff/ff-decoder.c b/deps/libff/libff/ff-decoder.c index 2d1ecf7f7..a9fd5fe62 100644 --- a/deps/libff/libff/ff-decoder.c +++ b/deps/libff/libff/ff-decoder.c @@ -245,9 +245,9 @@ bool ff_decoder_full(struct ff_decoder *decoder) return (decoder->packet_queue.total_size > decoder->packet_queue_size); } -bool ff_decoder_accept(struct ff_decoder *decoder, AVPacket *packet) +bool ff_decoder_accept(struct ff_decoder *decoder, struct ff_packet *packet) { - if (decoder && packet->stream_index == decoder->stream->index) { + if (decoder && packet->base.stream_index == decoder->stream->index) { packet_queue_put(&decoder->packet_queue, packet); return true; } diff --git a/deps/libff/libff/ff-decoder.h b/deps/libff/libff/ff-decoder.h index 8e2c882ff..4f2a75176 100644 --- a/deps/libff/libff/ff-decoder.h +++ b/deps/libff/libff/ff-decoder.h @@ -59,7 +59,7 @@ bool ff_decoder_start(struct ff_decoder *decoder); void ff_decoder_free(struct ff_decoder *decoder); bool ff_decoder_full(struct ff_decoder *decoder); -bool ff_decoder_accept(struct ff_decoder *decoder, AVPacket *packet); +bool ff_decoder_accept(struct ff_decoder *decoder, struct ff_packet *packet); double ff_decoder_clock(void *opaque); diff --git a/deps/libff/libff/ff-demuxer.c b/deps/libff/libff/ff-demuxer.c index 49b28103d..55eb7d286 100644 --- a/deps/libff/libff/ff-demuxer.c +++ b/deps/libff/libff/ff-demuxer.c @@ -448,7 +448,7 @@ static void *demux_thread(void *opaque) struct ff_demuxer *demuxer = (struct ff_demuxer *) opaque; int result; - AVPacket packet; + struct ff_packet packet = {0}; if (!open_input(demuxer, &demuxer->format_context)) goto fail; @@ -469,7 +469,7 @@ static void *demux_thread(void *opaque) continue; } - result = av_read_frame(demuxer->format_context, &packet); + result = av_read_frame(demuxer->format_context, &packet.base); if (result < 0) { bool eof = false; if (result == AVERROR_EOF) { @@ -506,7 +506,7 @@ static void *demux_thread(void *opaque) else if (ff_decoder_accept(demuxer->audio_decoder, &packet)) continue; else - av_free_packet(&packet); + av_free_packet(&packet.base); } if (demuxer->audio_decoder != NULL) demuxer->audio_decoder->eof = true; diff --git a/deps/libff/libff/ff-packet-queue.c b/deps/libff/libff/ff-packet-queue.c index ca3de20cc..4bf63d379 100644 --- a/deps/libff/libff/ff-packet-queue.c +++ b/deps/libff/libff/ff-packet-queue.c @@ -26,8 +26,8 @@ bool packet_queue_init(struct ff_packet_queue *q) if (pthread_cond_init(&q->cond, NULL) != 0) goto fail1; - av_init_packet(&q->flush_packet); - q->flush_packet.data = (uint8_t *)"FLUSH"; + av_init_packet(&q->flush_packet.base); + q->flush_packet.base.data = (uint8_t *)"FLUSH"; return true; @@ -53,22 +53,23 @@ void packet_queue_free(struct ff_packet_queue *q) pthread_mutex_destroy(&q->mutex); pthread_cond_destroy(&q->cond); - av_free_packet(&q->flush_packet); + av_free_packet(&q->flush_packet.base); } -int packet_queue_put(struct ff_packet_queue *q, AVPacket *packet) +int packet_queue_put(struct ff_packet_queue *q, struct ff_packet *packet) { - AVPacketList *new_packet; + struct ff_packet_list *new_packet; - if (packet != &q->flush_packet && av_dup_packet(packet) < 0) + if (packet != &q->flush_packet + && av_dup_packet(&packet->base) < 0) return FF_PACKET_FAIL; - new_packet = av_malloc(sizeof(AVPacketList)); + new_packet = av_malloc(sizeof(struct ff_packet_list)); if (new_packet == NULL) return FF_PACKET_FAIL; - new_packet->pkt = *packet; + new_packet->packet = *packet; new_packet->next = NULL; pthread_mutex_lock(&q->mutex); @@ -81,7 +82,7 @@ int packet_queue_put(struct ff_packet_queue *q, AVPacket *packet) q->last_packet = new_packet; q->count++; - q->total_size += new_packet->pkt.size; + q->total_size += new_packet->packet.base.size; pthread_cond_signal(&q->cond); pthread_mutex_unlock(&q->mutex); @@ -94,9 +95,10 @@ int packet_queue_put_flush_packet(struct ff_packet_queue *q) return packet_queue_put(q, &q->flush_packet); } -int packet_queue_get(struct ff_packet_queue *q, AVPacket *packet, bool block) +int packet_queue_get(struct ff_packet_queue *q, struct ff_packet *packet, + bool block) { - AVPacketList *potential_packet; + struct ff_packet_list *potential_packet; int return_status; pthread_mutex_lock(&q->mutex); @@ -111,8 +113,8 @@ int packet_queue_get(struct ff_packet_queue *q, AVPacket *packet, bool block) q->last_packet = NULL; q->count--; - q->total_size -= potential_packet->pkt.size; - *packet = potential_packet->pkt; + q->total_size -= potential_packet->packet.base.size; + *packet = potential_packet->packet; av_free(potential_packet); return_status = FF_PACKET_SUCCESS; break; @@ -137,14 +139,14 @@ int packet_queue_get(struct ff_packet_queue *q, AVPacket *packet, bool block) void packet_queue_flush(struct ff_packet_queue *q) { - AVPacketList *packet; + struct ff_packet_list *packet; pthread_mutex_lock(&q->mutex); for (packet = q->first_packet; packet != NULL; packet = q->first_packet) { q->first_packet = packet->next; - av_free_packet(&packet->pkt); + av_free_packet(&packet->packet.base); av_freep(&packet); } diff --git a/deps/libff/libff/ff-packet-queue.h b/deps/libff/libff/ff-packet-queue.h index d91e829be..26e00dcf6 100644 --- a/deps/libff/libff/ff-packet-queue.h +++ b/deps/libff/libff/ff-packet-queue.h @@ -24,12 +24,21 @@ #define FF_PACKET_EMPTY 0 #define FF_PACKET_SUCCESS 1 +struct ff_packet { + AVPacket base; +}; + +struct ff_packet_list { + struct ff_packet packet; + struct ff_packet_list *next; +}; + struct ff_packet_queue { - AVPacketList *first_packet; - AVPacketList *last_packet; + struct ff_packet_list *first_packet; + struct ff_packet_list *last_packet; pthread_mutex_t mutex; pthread_cond_t cond; - AVPacket flush_packet; + struct ff_packet flush_packet; int count; unsigned int total_size; bool abort; @@ -40,8 +49,9 @@ typedef struct ff_packet_queue ff_packet_queue_t; bool packet_queue_init(struct ff_packet_queue *q); void packet_queue_abort(struct ff_packet_queue *q); void packet_queue_free(struct ff_packet_queue *q); -int packet_queue_put(struct ff_packet_queue *q, AVPacket *packet); +int packet_queue_put(struct ff_packet_queue *q, struct ff_packet *packet); int packet_queue_put_flush_packet(struct ff_packet_queue *q); -int packet_queue_get(struct ff_packet_queue *q, AVPacket *packet, bool block); +int packet_queue_get(struct ff_packet_queue *q, struct ff_packet *packet, + bool block); void packet_queue_flush(struct ff_packet_queue *q); diff --git a/deps/libff/libff/ff-video-decoder.c b/deps/libff/libff/ff-video-decoder.c index ce4ae0a1f..ce1c0987d 100644 --- a/deps/libff/libff/ff-video-decoder.c +++ b/deps/libff/libff/ff-video-decoder.c @@ -68,7 +68,7 @@ void *ff_video_decoder_thread(void *opaque_video_decoder) { struct ff_decoder *decoder = (struct ff_decoder*)opaque_video_decoder; - AVPacket packet = {0}; + struct ff_packet packet = {0}; int complete; AVFrame *frame = av_frame_alloc(); int ret; @@ -80,13 +80,13 @@ void *ff_video_decoder_thread(void *opaque_video_decoder) break; } - if (packet.data == decoder->packet_queue.flush_packet.data) { + if (packet.base.data == decoder->packet_queue.flush_packet.base.data) { avcodec_flush_buffers(decoder->codec); continue; } avcodec_decode_video2(decoder->codec, frame, - &complete, &packet); + &complete, &packet.base); // Did we get an entire video frame? This doesn't guarantee // there is a picture to show for some codecs, but we still want @@ -104,7 +104,7 @@ void *ff_video_decoder_thread(void *opaque_video_decoder) av_frame_unref(frame); } - av_free_packet(&packet); + av_free_packet(&packet.base); } av_frame_free(&frame);