Browse Source

deps-libff: Refactor AVPacket into ff_packet

This also replaces AVPacketList with ff_packet_list.
John Bradley 10 years ago
parent
commit
b91a98ed44

+ 18 - 15
deps/libff/libff/ff-audio-decoder.c

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

+ 2 - 2
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;
 	}

+ 1 - 1
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);
 

+ 3 - 3
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;

+ 17 - 15
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);
 	}
 

+ 15 - 5
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);

+ 4 - 4
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);