[libav-commits] Move code shared between libdirac and libschroedinger to libschroedinger.

Diego Biurrun git at libav.org
Mon May 7 17:58:47 CEST 2012


Module: libav
Branch: master
Commit: 9cef0669c4e0e98cd6b5746e6de5b0da800f7edb

Author:    Diego Biurrun <diego at biurrun.de>
Committer: Diego Biurrun <diego at biurrun.de>
Date:      Sat Apr 14 15:24:57 2012 +0200

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.

---

 libavcodec/Makefile             |    6 +--
 libavcodec/libdirac_libschro.c  |  113 ---------------------------------------
 libavcodec/libdirac_libschro.h  |  105 ------------------------------------
 libavcodec/libschroedinger.c    |   91 ++++++++++++++++++++++++++++++-
 libavcodec/libschroedinger.h    |   70 ++++++++++++++++++++++++
 libavcodec/libschroedingerdec.c |   21 ++++----
 libavcodec/libschroedingerenc.c |   21 ++++----
 7 files changed, 180 insertions(+), 247 deletions(-)

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 55767f7..98d70f0 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 45b5b83..0000000
--- 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 a80558f..0000000
--- 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 527c492..fb0bfaa 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 8147821..8d04d2c 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 1e632de..20f9447 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 f07c83e..d9b8b06 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. */



More information about the libav-commits mailing list