summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorDiego Biurrun <diego@biurrun.de>2012-04-14 15:24:57 +0200
committerDiego Biurrun <diego@biurrun.de>2012-05-07 14:31:59 +0200
commit9cef0669c4e0e98cd6b5746e6de5b0da800f7edb (patch)
treece265b0fed27b3d643b6fa5e9a412f0f990ab089 /libavcodec
parent8134fafe9bdda58e24a9574c251ed3a9b5809c51 (diff)
Move code shared between libdirac and libschroedinger to libschroedinger.
This also involves making some function static and changing the name prefixes of some functions and structures.
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/Makefile6
-rw-r--r--libavcodec/libdirac_libschro.c113
-rw-r--r--libavcodec/libdirac_libschro.h105
-rw-r--r--libavcodec/libschroedinger.c91
-rw-r--r--libavcodec/libschroedinger.h70
-rw-r--r--libavcodec/libschroedingerdec.c21
-rw-r--r--libavcodec/libschroedingerenc.c21
7 files changed, 180 insertions, 247 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 55767f7c39..98d70f07d8 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -601,11 +601,9 @@ OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER) += libopencore-amr.o
OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER) += libopencore-amr.o
OBJS-$(CONFIG_LIBOPENJPEG_DECODER) += libopenjpeg.o
OBJS-$(CONFIG_LIBSCHROEDINGER_DECODER) += libschroedingerdec.o \
- libschroedinger.o \
- libdirac_libschro.o
+ libschroedinger.o
OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER) += libschroedingerenc.o \
- libschroedinger.o \
- libdirac_libschro.o
+ libschroedinger.o
OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o
OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o audio_frame_queue.o
OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o
diff --git a/libavcodec/libdirac_libschro.c b/libavcodec/libdirac_libschro.c
deleted file mode 100644
index 45b5b83264..0000000000
--- a/libavcodec/libdirac_libschro.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com >
- *
- * This file is part of Libav.
- *
- * Libav is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * Libav is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
-* @file
-* functions common to libdirac and libschroedinger
-*/
-
-#include "libdirac_libschro.h"
-
-static const DiracSchroVideoFormatInfo ff_dirac_schro_video_format_info[] = {
- { 640, 480, 24000, 1001},
- { 176, 120, 15000, 1001},
- { 176, 144, 25, 2 },
- { 352, 240, 15000, 1001},
- { 352, 288, 25, 2 },
- { 704, 480, 15000, 1001},
- { 704, 576, 25, 2 },
- { 720, 480, 30000, 1001},
- { 720, 576, 25, 1 },
- { 1280, 720, 60000, 1001},
- { 1280, 720, 50, 1 },
- { 1920, 1080, 30000, 1001},
- { 1920, 1080, 25, 1 },
- { 1920, 1080, 60000, 1001},
- { 1920, 1080, 50, 1 },
- { 2048, 1080, 24, 1 },
- { 4096, 2160, 24, 1 },
-};
-
-unsigned int ff_dirac_schro_get_video_format_idx(AVCodecContext *avccontext)
-{
- unsigned int ret_idx = 0;
- unsigned int idx;
- unsigned int num_formats = sizeof(ff_dirac_schro_video_format_info) /
- sizeof(ff_dirac_schro_video_format_info[0]);
-
- for (idx = 1; idx < num_formats; ++idx) {
- const DiracSchroVideoFormatInfo *vf = &ff_dirac_schro_video_format_info[idx];
- if (avccontext->width == vf->width &&
- avccontext->height == vf->height) {
- ret_idx = idx;
- if (avccontext->time_base.den == vf->frame_rate_num &&
- avccontext->time_base.num == vf->frame_rate_denom)
- return idx;
- }
- }
- return ret_idx;
-}
-
-void ff_dirac_schro_queue_init(DiracSchroQueue *queue)
-{
- queue->p_head = queue->p_tail = NULL;
- queue->size = 0;
-}
-
-void ff_dirac_schro_queue_free(DiracSchroQueue *queue,
- void (*free_func)(void *))
-{
- while (queue->p_head)
- free_func(ff_dirac_schro_queue_pop(queue));
-}
-
-int ff_dirac_schro_queue_push_back(DiracSchroQueue *queue, void *p_data)
-{
- DiracSchroQueueElement *p_new = av_mallocz(sizeof(DiracSchroQueueElement));
-
- if (!p_new)
- return -1;
-
- p_new->data = p_data;
-
- if (!queue->p_head)
- queue->p_head = p_new;
- else
- queue->p_tail->next = p_new;
- queue->p_tail = p_new;
-
- ++queue->size;
- return 0;
-}
-
-void *ff_dirac_schro_queue_pop(DiracSchroQueue *queue)
-{
- DiracSchroQueueElement *top = queue->p_head;
-
- if (top) {
- void *data = top->data;
- queue->p_head = queue->p_head->next;
- --queue->size;
- av_freep(&top);
- return data;
- }
-
- return NULL;
-}
diff --git a/libavcodec/libdirac_libschro.h b/libavcodec/libdirac_libschro.h
deleted file mode 100644
index a80558f820..0000000000
--- a/libavcodec/libdirac_libschro.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com >
- *
- * This file is part of Libav.
- *
- * Libav is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * Libav is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-/**
-* @file
-* data structures common to libdirac and libschroedinger
-*/
-
-#ifndef AVCODEC_LIBDIRAC_LIBSCHRO_H
-#define AVCODEC_LIBDIRAC_LIBSCHRO_H
-
-#include "avcodec.h"
-
-typedef struct {
- uint16_t width;
- uint16_t height;
- uint16_t frame_rate_num;
- uint16_t frame_rate_denom;
-} DiracSchroVideoFormatInfo;
-
-/**
-* Returns the index into the Dirac Schro common video format info table
-*/
-unsigned int ff_dirac_schro_get_video_format_idx(AVCodecContext *avccontext);
-
-/**
-* contains a single encoded frame returned from Dirac or Schroedinger
-*/
-typedef struct DiracSchroEncodedFrame {
- /** encoded frame data */
- uint8_t *p_encbuf;
-
- /** encoded frame size */
- uint32_t size;
-
- /** encoded frame number. Will be used as pts */
- uint32_t frame_num;
-
- /** key frame flag. 1 : is key frame , 0 : in not key frame */
- uint16_t key_frame;
-} DiracSchroEncodedFrame;
-
-/**
-* queue element
-*/
-typedef struct DiracSchroQueueElement {
- /** Data to be stored in queue*/
- void *data;
- /** Pointer to next element queue */
- struct DiracSchroQueueElement *next;
-} DiracSchroQueueElement;
-
-
-/**
-* A simple queue implementation used in libdirac and libschroedinger
-*/
-typedef struct DiracSchroQueue {
- /** Pointer to head of queue */
- DiracSchroQueueElement *p_head;
- /** Pointer to tail of queue */
- DiracSchroQueueElement *p_tail;
- /** Queue size*/
- int size;
-} DiracSchroQueue;
-
-/**
-* Initialise the queue
-*/
-void ff_dirac_schro_queue_init(DiracSchroQueue *queue);
-
-/**
-* Add an element to the end of the queue
-*/
-int ff_dirac_schro_queue_push_back(DiracSchroQueue *queue, void *p_data);
-
-/**
-* Return the first element in the queue
-*/
-void *ff_dirac_schro_queue_pop(DiracSchroQueue *queue);
-
-/**
-* Free the queue resources. free_func is a function supplied by the caller to
-* free any resources allocated by the caller. The data field of the queue
-* element is passed to it.
-*/
-void ff_dirac_schro_queue_free(DiracSchroQueue *queue,
- void (*free_func)(void *));
-#endif /* AVCODEC_LIBDIRAC_LIBSCHRO_H */
diff --git a/libavcodec/libschroedinger.c b/libavcodec/libschroedinger.c
index 527c4927ae..fb0bfaa84d 100644
--- a/libavcodec/libschroedinger.c
+++ b/libavcodec/libschroedinger.c
@@ -23,12 +23,97 @@
* function definitions common to libschroedinger decoder and encoder
*/
-#include "libdirac_libschro.h"
#include "libschroedinger.h"
+static const SchroVideoFormatInfo ff_schro_video_format_info[] = {
+ { 640, 480, 24000, 1001},
+ { 176, 120, 15000, 1001},
+ { 176, 144, 25, 2 },
+ { 352, 240, 15000, 1001},
+ { 352, 288, 25, 2 },
+ { 704, 480, 15000, 1001},
+ { 704, 576, 25, 2 },
+ { 720, 480, 30000, 1001},
+ { 720, 576, 25, 1 },
+ { 1280, 720, 60000, 1001},
+ { 1280, 720, 50, 1 },
+ { 1920, 1080, 30000, 1001},
+ { 1920, 1080, 25, 1 },
+ { 1920, 1080, 60000, 1001},
+ { 1920, 1080, 50, 1 },
+ { 2048, 1080, 24, 1 },
+ { 4096, 2160, 24, 1 },
+};
+
+static unsigned int get_video_format_idx(AVCodecContext *avccontext)
+{
+ unsigned int ret_idx = 0;
+ unsigned int idx;
+ unsigned int num_formats = sizeof(ff_schro_video_format_info) /
+ sizeof(ff_schro_video_format_info[0]);
+
+ for (idx = 1; idx < num_formats; ++idx) {
+ const SchroVideoFormatInfo *vf = &ff_schro_video_format_info[idx];
+ if (avccontext->width == vf->width &&
+ avccontext->height == vf->height) {
+ ret_idx = idx;
+ if (avccontext->time_base.den == vf->frame_rate_num &&
+ avccontext->time_base.num == vf->frame_rate_denom)
+ return idx;
+ }
+ }
+ return ret_idx;
+}
+
+void ff_schro_queue_init(FFSchroQueue *queue)
+{
+ queue->p_head = queue->p_tail = NULL;
+ queue->size = 0;
+}
+
+void ff_schro_queue_free(FFSchroQueue *queue, void (*free_func)(void *))
+{
+ while (queue->p_head)
+ free_func(ff_schro_queue_pop(queue));
+}
+
+int ff_schro_queue_push_back(FFSchroQueue *queue, void *p_data)
+{
+ FFSchroQueueElement *p_new = av_mallocz(sizeof(FFSchroQueueElement));
+
+ if (!p_new)
+ return -1;
+
+ p_new->data = p_data;
+
+ if (!queue->p_head)
+ queue->p_head = p_new;
+ else
+ queue->p_tail->next = p_new;
+ queue->p_tail = p_new;
+
+ ++queue->size;
+ return 0;
+}
+
+void *ff_schro_queue_pop(FFSchroQueue *queue)
+{
+ FFSchroQueueElement *top = queue->p_head;
+
+ if (top) {
+ void *data = top->data;
+ queue->p_head = queue->p_head->next;
+ --queue->size;
+ av_freep(&top);
+ return data;
+ }
+
+ return NULL;
+}
+
/**
* Schroedinger video preset table. Ensure that this tables matches up correctly
-* with the ff_dirac_schro_video_format_info table in libdirac_libschro.c.
+* with the ff_schro_video_format_info table.
*/
static const SchroVideoFormatEnum ff_schro_video_formats[]={
SCHRO_VIDEO_FORMAT_CUSTOM ,
@@ -55,7 +140,7 @@ SchroVideoFormatEnum ff_get_schro_video_format_preset(AVCodecContext *avccontext
unsigned int num_formats = sizeof(ff_schro_video_formats) /
sizeof(ff_schro_video_formats[0]);
- unsigned int idx = ff_dirac_schro_get_video_format_idx (avccontext);
+ unsigned int idx = get_video_format_idx(avccontext);
return (idx < num_formats) ? ff_schro_video_formats[idx] :
SCHRO_VIDEO_FORMAT_CUSTOM;
diff --git a/libavcodec/libschroedinger.h b/libavcodec/libschroedinger.h
index 814782111b..8d04d2cdcb 100644
--- a/libavcodec/libschroedinger.h
+++ b/libavcodec/libschroedinger.h
@@ -28,8 +28,78 @@
#include <schroedinger/schrobitstream.h>
#include <schroedinger/schroframe.h>
+
#include "avcodec.h"
+typedef struct {
+ uint16_t width;
+ uint16_t height;
+ uint16_t frame_rate_num;
+ uint16_t frame_rate_denom;
+} SchroVideoFormatInfo;
+
+/**
+* contains a single encoded frame returned from Dirac or Schroedinger
+*/
+typedef struct FFSchroEncodedFrame {
+ /** encoded frame data */
+ uint8_t *p_encbuf;
+
+ /** encoded frame size */
+ uint32_t size;
+
+ /** encoded frame number. Will be used as pts */
+ uint32_t frame_num;
+
+ /** key frame flag. 1 : is key frame , 0 : in not key frame */
+ uint16_t key_frame;
+} FFSchroEncodedFrame;
+
+/**
+* queue element
+*/
+typedef struct FFSchroQueueElement {
+ /** Data to be stored in queue*/
+ void *data;
+ /** Pointer to next element queue */
+ struct FFSchroQueueElement *next;
+} FFSchroQueueElement;
+
+
+/**
+* A simple queue implementation used in libschroedinger
+*/
+typedef struct FFSchroQueue {
+ /** Pointer to head of queue */
+ FFSchroQueueElement *p_head;
+ /** Pointer to tail of queue */
+ FFSchroQueueElement *p_tail;
+ /** Queue size*/
+ int size;
+} FFSchroQueue;
+
+/**
+* Initialise the queue
+*/
+void ff_schro_queue_init(FFSchroQueue *queue);
+
+/**
+* Add an element to the end of the queue
+*/
+int ff_schro_queue_push_back(FFSchroQueue *queue, void *p_data);
+
+/**
+* Return the first element in the queue
+*/
+void *ff_schro_queue_pop(FFSchroQueue *queue);
+
+/**
+* Free the queue resources. free_func is a function supplied by the caller to
+* free any resources allocated by the caller. The data field of the queue
+* element is passed to it.
+*/
+void ff_schro_queue_free(FFSchroQueue *queue, void (*free_func)(void *));
+
static const struct {
enum PixelFormat ff_pix_fmt;
SchroChromaFormat schro_pix_fmt;
diff --git a/libavcodec/libschroedingerdec.c b/libavcodec/libschroedingerdec.c
index 1e632de017..20f9447fc6 100644
--- a/libavcodec/libschroedingerdec.c
+++ b/libavcodec/libschroedingerdec.c
@@ -29,7 +29,6 @@
#include "libavutil/imgutils.h"
#include "avcodec.h"
-#include "libdirac_libschro.h"
#include "libschroedinger.h"
#undef NDEBUG
@@ -52,7 +51,7 @@ typedef struct SchroDecoderParams {
SchroDecoder* decoder;
/** queue storing decoded frames */
- DiracSchroQueue dec_frame_queue;
+ FFSchroQueue dec_frame_queue;
/** end of sequence signalled */
int eos_signalled;
@@ -155,7 +154,7 @@ static av_cold int libschroedinger_decode_init(AVCodecContext *avccontext)
return -1;
/* Initialize the decoded frame queue. */
- ff_dirac_schro_queue_init(&p_schro_params->dec_frame_queue);
+ ff_schro_queue_init(&p_schro_params->dec_frame_queue);
return 0;
}
@@ -267,8 +266,8 @@ static int libschroedinger_decode_frame(AVCodecContext *avccontext,
frame = schro_decoder_pull(decoder);
if (frame)
- ff_dirac_schro_queue_push_back(&p_schro_params->dec_frame_queue,
- frame);
+ ff_schro_queue_push_back(&p_schro_params->dec_frame_queue,
+ frame);
break;
case SCHRO_DECODER_EOS:
go = 0;
@@ -285,7 +284,7 @@ static int libschroedinger_decode_frame(AVCodecContext *avccontext,
} while (outer);
/* Grab next frame to be returned from the top of the queue. */
- frame = ff_dirac_schro_queue_pop(&p_schro_params->dec_frame_queue);
+ frame = ff_schro_queue_pop(&p_schro_params->dec_frame_queue);
if (frame) {
memcpy(p_schro_params->dec_pic.data[0],
@@ -324,8 +323,8 @@ static av_cold int libschroedinger_decode_close(AVCodecContext *avccontext)
avpicture_free(&p_schro_params->dec_pic);
/* Free data in the output frame queue. */
- ff_dirac_schro_queue_free(&p_schro_params->dec_frame_queue,
- libschroedinger_decode_frame_free);
+ ff_schro_queue_free(&p_schro_params->dec_frame_queue,
+ libschroedinger_decode_frame_free);
return 0;
}
@@ -337,10 +336,10 @@ static void libschroedinger_flush(AVCodecContext *avccontext)
SchroDecoderParams *p_schro_params = avccontext->priv_data;
/* Free data in the output frame queue. */
- ff_dirac_schro_queue_free(&p_schro_params->dec_frame_queue,
- libschroedinger_decode_frame_free);
+ ff_schro_queue_free(&p_schro_params->dec_frame_queue,
+ libschroedinger_decode_frame_free);
- ff_dirac_schro_queue_init(&p_schro_params->dec_frame_queue);
+ ff_schro_queue_init(&p_schro_params->dec_frame_queue);
schro_decoder_reset(p_schro_params->decoder);
p_schro_params->eos_pulled = 0;
p_schro_params->eos_signalled = 0;
diff --git a/libavcodec/libschroedingerenc.c b/libavcodec/libschroedingerenc.c
index f07c83e105..d9b8b06a7d 100644
--- a/libavcodec/libschroedingerenc.c
+++ b/libavcodec/libschroedingerenc.c
@@ -36,7 +36,6 @@
#include "avcodec.h"
#include "internal.h"
-#include "libdirac_libschro.h"
#include "libschroedinger.h"
#include "bytestream.h"
@@ -65,7 +64,7 @@ typedef struct SchroEncoderParams {
int enc_buf_size;
/** queue storing encoded frames */
- DiracSchroQueue enc_frame_queue;
+ FFSchroQueue enc_frame_queue;
/** end of sequence signalled */
int eos_signalled;
@@ -236,7 +235,7 @@ static int libschroedinger_encode_init(AVCodecContext *avccontext)
schro_encoder_start(p_schro_params->encoder);
/* Initialize the encoded frame queue. */
- ff_dirac_schro_queue_init(&p_schro_params->enc_frame_queue);
+ ff_schro_queue_init(&p_schro_params->enc_frame_queue);
return 0;
}
@@ -261,7 +260,7 @@ static SchroFrame *libschroedinger_frame_from_data(AVCodecContext *avccontext,
static void SchroedingerFreeFrame(void *data)
{
- DiracSchroEncodedFrame *enc_frame = data;
+ FFSchroEncodedFrame *enc_frame = data;
av_freep(&enc_frame->p_encbuf);
av_free(enc_frame);
@@ -273,7 +272,7 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
int enc_size = 0;
SchroEncoderParams *p_schro_params = avccontext->priv_data;
SchroEncoder *encoder = p_schro_params->encoder;
- struct DiracSchroEncodedFrame *p_frame_output = NULL;
+ struct FFSchroEncodedFrame *p_frame_output = NULL;
int go = 1;
SchroBuffer *enc_buf;
int presentation_frame;
@@ -333,7 +332,7 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
}
/* Create output frame. */
- p_frame_output = av_mallocz(sizeof(DiracSchroEncodedFrame));
+ p_frame_output = av_mallocz(sizeof(FFSchroEncodedFrame));
/* Set output data. */
p_frame_output->size = p_schro_params->enc_buf_size;
p_frame_output->p_encbuf = p_schro_params->enc_buf;
@@ -345,8 +344,8 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
* through 17 represesent the frame number. */
p_frame_output->frame_num = AV_RB32(enc_buf->data + 13);
- ff_dirac_schro_queue_push_back(&p_schro_params->enc_frame_queue,
- p_frame_output);
+ ff_schro_queue_push_back(&p_schro_params->enc_frame_queue,
+ p_frame_output);
p_schro_params->enc_buf_size = 0;
p_schro_params->enc_buf = NULL;
@@ -373,7 +372,7 @@ static int libschroedinger_encode_frame(AVCodecContext *avccontext, AVPacket *pk
p_schro_params->eos_pulled)
last_frame_in_sequence = 1;
- p_frame_output = ff_dirac_schro_queue_pop(&p_schro_params->enc_frame_queue);
+ p_frame_output = ff_schro_queue_pop(&p_schro_params->enc_frame_queue);
if (!p_frame_output)
return 0;
@@ -425,8 +424,8 @@ static int libschroedinger_encode_close(AVCodecContext *avccontext)
schro_encoder_free(p_schro_params->encoder);
/* Free data in the output frame queue. */
- ff_dirac_schro_queue_free(&p_schro_params->enc_frame_queue,
- SchroedingerFreeFrame);
+ ff_schro_queue_free(&p_schro_params->enc_frame_queue,
+ SchroedingerFreeFrame);
/* Free the encoder buffer. */