deps-libff: Refactor AVPacket into ff_packet

This also replaces AVPacketList with ff_packet_list.
This commit is contained in:
John Bradley 2015-03-19 11:00:42 -05:00
parent a7e81d6f3f
commit b91a98ed44
7 changed files with 60 additions and 45 deletions

View file

@ -28,29 +28,30 @@
#include <assert.h>
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);

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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);
}

View file

@ -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);

View file

@ -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);