[FFmpeg-cvslog] prores: move data shared between decoder and encoder to common file

Kostya Shishkov git at videolan.org
Thu Feb 16 01:46:55 CET 2012


ffmpeg | branch: master | Kostya Shishkov <kostya.shishkov at gmail.com> | Sat Dec 10 13:40:39 2011 +0100| [8835c2c829d84d99e237e63f432b6e9f54e2ecf6] | committer: Kostya Shishkov

prores: move data shared between decoder and encoder to common file

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8835c2c829d84d99e237e63f432b6e9f54e2ecf6
---

 libavcodec/Makefile     |    2 +-
 libavcodec/proresdata.c |   72 +++++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/proresdata.h |   39 +++++++++++++++++++++++++
 libavcodec/proresdec.c  |   69 +++++---------------------------------------
 4 files changed, 120 insertions(+), 62 deletions(-)

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 2eaef6b..6d4ad95 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -301,7 +301,7 @@ OBJS-$(CONFIG_PNG_DECODER)             += png.o pngdec.o pngdsp.o
 OBJS-$(CONFIG_PNG_ENCODER)             += png.o pngenc.o
 OBJS-$(CONFIG_PPM_DECODER)             += pnmdec.o pnm.o
 OBJS-$(CONFIG_PPM_ENCODER)             += pnmenc.o pnm.o
-OBJS-$(CONFIG_PRORES_DECODER)          += proresdec.o proresdsp.o
+OBJS-$(CONFIG_PRORES_DECODER)          += proresdec.o proresdata.o proresdsp.o
 OBJS-$(CONFIG_PTX_DECODER)             += ptx.o
 OBJS-$(CONFIG_QCELP_DECODER)           += qcelpdec.o celp_math.o         \
                                           celp_filters.o acelp_vectors.o \
diff --git a/libavcodec/proresdata.c b/libavcodec/proresdata.c
new file mode 100644
index 0000000..fcaf32a
--- /dev/null
+++ b/libavcodec/proresdata.c
@@ -0,0 +1,72 @@
+/*
+ * Apple ProRes compatible decoder
+ *
+ * Copyright (c) 2010-2011 Maxim Poliakovski
+ *
+ * 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
+ */
+
+#include "proresdata.h"
+
+const uint8_t ff_prores_progressive_scan[64] = {
+     0,  1,  8,  9,  2,  3, 10, 11,
+    16, 17, 24, 25, 18, 19, 26, 27,
+     4,  5, 12, 20, 13,  6,  7, 14,
+    21, 28, 29, 22, 15, 23, 30, 31,
+    32, 33, 40, 48, 41, 34, 35, 42,
+    49, 56, 57, 50, 43, 36, 37, 44,
+    51, 58, 59, 52, 45, 38, 39, 46,
+    53, 60, 61, 54, 47, 55, 62, 63
+};
+
+const uint8_t ff_prores_interlaced_scan[64] = {
+     0,  8,  1,  9, 16, 24, 17, 25,
+     2, 10,  3, 11, 18, 26, 19, 27,
+    32, 40, 33, 34, 41, 48, 56, 49,
+    42, 35, 43, 50, 57, 58, 51, 59,
+     4, 12,  5,  6, 13, 20, 28, 21,
+    14,  7, 15, 22, 29, 36, 44, 37,
+    30, 23, 31, 38, 45, 52, 60, 53,
+    46, 39, 47, 54, 61, 62, 55, 63
+};
+
+
+const uint8_t ff_prores_dc_codebook[4] = {
+    0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0
+    0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0
+    0x4D, // rice_order = 2, exp_golomb_order = 3, switch_bits = 1
+    0x70  // rice_order = 3, exp_golomb_order = 4, switch_bits = 0
+};
+
+const uint8_t ff_prores_ac_codebook[7] = {
+    0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0
+    0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0
+    0x4C, // rice_order = 2, exp_golomb_order = 3, switch_bits = 0
+    0x05, // rice_order = 0, exp_golomb_order = 1, switch_bits = 1
+    0x29, // rice_order = 1, exp_golomb_order = 2, switch_bits = 1
+    0x06, // rice_order = 0, exp_golomb_order = 1, switch_bits = 2
+    0x0A, // rice_order = 0, exp_golomb_order = 2, switch_bits = 2
+};
+
+/**
+ * Lookup tables for adaptive switching between codebooks
+ * according with previous run/level value.
+ */
+const uint8_t ff_prores_run_to_cb_index[16] =
+    { 5, 5, 3, 3, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2 };
+
+const uint8_t ff_prores_lev_to_cb_index[10] = { 0, 6, 3, 5, 0, 1, 1, 1, 1, 2 };
diff --git a/libavcodec/proresdata.h b/libavcodec/proresdata.h
new file mode 100644
index 0000000..1e5d05e
--- /dev/null
+++ b/libavcodec/proresdata.h
@@ -0,0 +1,39 @@
+/*
+ * Apple ProRes compatible decoder
+ *
+ * Copyright (c) 2010-2011 Maxim Poliakovski
+ *
+ * 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
+ */
+
+#ifndef AVCODEC_PRORESDATA_H
+#define AVCODEC_PRORESDATA_H
+
+#include <stdint.h>
+
+#define FRAME_ID MKBETAG('i', 'c', 'p', 'f')
+
+extern const uint8_t ff_prores_progressive_scan[64];
+extern const uint8_t ff_prores_interlaced_scan[64];
+
+#define FIRST_DC_CB 0xB8 // rice_order = 5, exp_golomb_order = 6, switch_bits = 0
+extern const uint8_t ff_prores_dc_codebook[4];
+extern const uint8_t ff_prores_ac_codebook[7];
+extern const uint8_t ff_prores_run_to_cb_index[16];
+extern const uint8_t ff_prores_lev_to_cb_index[10];
+
+#endif /* AVCODEC_PRORESDATA_H */
diff --git a/libavcodec/proresdec.c b/libavcodec/proresdec.c
index ba78b62..207fd97 100644
--- a/libavcodec/proresdec.c
+++ b/libavcodec/proresdec.c
@@ -34,6 +34,7 @@
 
 #include "libavutil/intmath.h"
 #include "avcodec.h"
+#include "proresdata.h"
 #include "proresdsp.h"
 #include "get_bits.h"
 
@@ -75,29 +76,6 @@ typedef struct {
 } ProresContext;
 
 
-static const uint8_t progressive_scan[64] = {
-     0,  1,  8,  9,  2,  3, 10, 11,
-    16, 17, 24, 25, 18, 19, 26, 27,
-     4,  5, 12, 20, 13,  6,  7, 14,
-    21, 28, 29, 22, 15, 23, 30, 31,
-    32, 33, 40, 48, 41, 34, 35, 42,
-    49, 56, 57, 50, 43, 36, 37, 44,
-    51, 58, 59, 52, 45, 38, 39, 46,
-    53, 60, 61, 54, 47, 55, 62, 63
-};
-
-static const uint8_t interlaced_scan[64] = {
-     0,  8,  1,  9, 16, 24, 17, 25,
-     2, 10,  3, 11, 18, 26, 19, 27,
-    32, 40, 33, 34, 41, 48, 56, 49,
-    42, 35, 43, 50, 57, 58, 51, 59,
-     4, 12,  5,  6, 13, 20, 28, 21,
-    14,  7, 15, 22, 29, 36, 44, 37,
-    30, 23, 31, 38, 45, 52, 60, 53,
-    46, 39, 47, 54, 61, 62, 55, 63
-};
-
-
 static av_cold int decode_init(AVCodecContext *avctx)
 {
     ProresContext *ctx = avctx->priv_data;
@@ -175,10 +153,10 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
     if (ctx->scantable_type != ctx->frame_type) {
         if (!ctx->frame_type)
             ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable,
-                              progressive_scan);
+                              ff_prores_progressive_scan);
         else
             ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable,
-                              interlaced_scan);
+                              ff_prores_interlaced_scan);
         ctx->scantable_type = ctx->frame_type;
     }
 
@@ -352,16 +330,6 @@ static inline int decode_vlc_codeword(GetBitContext *gb, uint8_t codebook)
 #define LSB2SIGN(x) (-((x) & 1))
 #define TOSIGNED(x) (((x) >> 1) ^ LSB2SIGN(x))
 
-#define FIRST_DC_CB 0xB8 // rice_order = 5, exp_golomb_order = 6, switch_bits = 0
-
-static uint8_t dc_codebook[4] = {
-    0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0
-    0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0
-    0x4D, // rice_order = 2, exp_golomb_order = 3, switch_bits = 1
-    0x70  // rice_order = 3, exp_golomb_order = 4, switch_bits = 0
-};
-
-
 /**
  * Decode DC coefficients for all blocks in a slice.
  */
@@ -380,7 +348,7 @@ static inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out,
     delta  = 3;
 
     for (i = 1; i < nblocks; i++, out += 64) {
-        code = decode_vlc_codeword(gb, dc_codebook[FFMIN(FFABS(delta), 3)]);
+        code = decode_vlc_codeword(gb, ff_prores_dc_codebook[FFMIN(FFABS(delta), 3)]);
 
         sign     = -(((delta >> 15) & 1) ^ (code & 1));
         delta    = (((code + 1) >> 1) ^ sign) - sign;
@@ -390,26 +358,6 @@ static inline void decode_dc_coeffs(GetBitContext *gb, DCTELEM *out,
 }
 
 
-static uint8_t ac_codebook[7] = {
-    0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0
-    0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0
-    0x4C, // rice_order = 2, exp_golomb_order = 3, switch_bits = 0
-    0x05, // rice_order = 0, exp_golomb_order = 1, switch_bits = 1
-    0x29, // rice_order = 1, exp_golomb_order = 2, switch_bits = 1
-    0x06, // rice_order = 0, exp_golomb_order = 1, switch_bits = 2
-    0x0A, // rice_order = 0, exp_golomb_order = 2, switch_bits = 2
-};
-
-/**
- * Lookup tables for adaptive switching between codebooks
- * according with previous run/level value.
- */
-static uint8_t run_to_cb_index[16] =
-    { 5, 5, 3, 3, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2 };
-
-static uint8_t lev_to_cb_index[10] = { 0, 6, 3, 5, 0, 1, 1, 1, 1, 2 };
-
-
 /**
  * Decode AC coefficients for all blocks in a slice.
  */
@@ -429,20 +377,20 @@ static inline void decode_ac_coeffs(GetBitContext *gb, DCTELEM *out,
     block_mask = blocks_per_slice - 1;
 
     for (pos = blocks_per_slice - 1; pos < max_coeffs;) {
-        run_cb_index = run_to_cb_index[FFMIN(run, 15)];
-        lev_cb_index = lev_to_cb_index[FFMIN(level, 9)];
+        run_cb_index = ff_prores_run_to_cb_index[FFMIN(run, 15)];
+        lev_cb_index = ff_prores_lev_to_cb_index[FFMIN(level, 9)];
 
         bits_left = get_bits_left(gb);
         if (bits_left <= 0 || (bits_left <= 8 && !show_bits(gb, bits_left)))
             return;
 
-        run = decode_vlc_codeword(gb, ac_codebook[run_cb_index]);
+        run = decode_vlc_codeword(gb, ff_prores_ac_codebook[run_cb_index]);
 
         bits_left = get_bits_left(gb);
         if (bits_left <= 0 || (bits_left <= 8 && !show_bits(gb, bits_left)))
             return;
 
-        level = decode_vlc_codeword(gb, ac_codebook[lev_cb_index]) + 1;
+        level = decode_vlc_codeword(gb, ff_prores_ac_codebook[lev_cb_index]) + 1;
 
         pos += run + 1;
         if (pos >= max_coeffs)
@@ -629,7 +577,6 @@ static int decode_picture(ProresContext *ctx, int pic_num,
 }
 
 
-#define FRAME_ID MKBETAG('i', 'c', 'p', 'f')
 #define MOVE_DATA_PTR(nbytes) buf += (nbytes); buf_size -= (nbytes)
 
 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,



More information about the ffmpeg-cvslog mailing list