You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
FFmpegAndroid/app/src/main/cpp/AVpacket_queue.c

61 lines
1.6 KiB

//
// Created by frank on 2018/2/3.
//
#include "AVpacket_queue.h"
#include <stdlib.h>
#include <libavcodec/avcodec.h>
AVPacketQueue *queue_init(int size) {
AVPacketQueue *queue = malloc(sizeof(AVPacketQueue));
queue->size = size;
queue->next_to_read = 0;
queue->next_to_write = 0;
int i;
queue->packets = malloc(sizeof(*queue->packets) * size);
for (i = 0; i < size; i++) {
queue->packets[i] = malloc(sizeof(AVPacket));
}
return queue;
}
void queue_free(AVPacketQueue *queue) {
int i;
for (i = 0; i < queue->size; i++) {
free(queue->packets[i]);
}
free(queue->packets);
free(queue);
}
int queue_next(AVPacketQueue *queue, int current) {
return (current + 1) % queue->size;
}
void *queue_push(AVPacketQueue *queue, pthread_mutex_t *mutex, pthread_cond_t *cond) {
int current = queue->next_to_write;
int next_to_write;
for (;;) {
next_to_write = queue_next(queue, current);
if (next_to_write != queue->next_to_read) {
break;
}
pthread_cond_wait(cond, mutex);
}
queue->next_to_write = next_to_write;
pthread_cond_broadcast(cond);
return queue->packets[current];
}
void *queue_pop(AVPacketQueue *queue, pthread_mutex_t *mutex, pthread_cond_t *cond) {
int current = queue->next_to_read;
for (;;) {
if (queue->next_to_write != queue->next_to_read) {
break;
}
pthread_cond_wait(cond, mutex);
}
queue->next_to_read = queue_next(queue, current);
pthread_cond_broadcast(cond);
return queue->packets[current];
}