mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-07-14 23:34:08 +00:00
deps-libff: Refactor AVPacket into ff_packet
This also replaces AVPacketList with ff_packet_list.
This commit is contained in:
parent
a7e81d6f3f
commit
b91a98ed44
33
deps/libff/libff/ff-audio-decoder.c
vendored
33
deps/libff/libff/ff-audio-decoder.c
vendored
|
@ -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);
|
||||
|
|
4
deps/libff/libff/ff-decoder.c
vendored
4
deps/libff/libff/ff-decoder.c
vendored
|
@ -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;
|
||||
}
|
||||
|
|
2
deps/libff/libff/ff-decoder.h
vendored
2
deps/libff/libff/ff-decoder.h
vendored
|
@ -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);
|
||||
|
||||
|
|
6
deps/libff/libff/ff-demuxer.c
vendored
6
deps/libff/libff/ff-demuxer.c
vendored
|
@ -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;
|
||||
|
|
32
deps/libff/libff/ff-packet-queue.c
vendored
32
deps/libff/libff/ff-packet-queue.c
vendored
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
20
deps/libff/libff/ff-packet-queue.h
vendored
20
deps/libff/libff/ff-packet-queue.h
vendored
|
@ -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);
|
||||
|
|
8
deps/libff/libff/ff-video-decoder.c
vendored
8
deps/libff/libff/ff-video-decoder.c
vendored
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue