From a28b0587455f1ed4ac9ac955cc95f95656019ce4 Mon Sep 17 00:00:00 2001 From: Reinhard Tartler Date: Sun, 1 May 2011 14:34:31 +0200 Subject: Update URL to fate samples --- doc/fate.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/fate.txt b/doc/fate.txt index f5f3759309..b23d3f6a64 100644 --- a/doc/fate.txt +++ b/doc/fate.txt @@ -7,7 +7,7 @@ that is provided separately from the actual source distribution. Use the following command to get the fate test samples -# rsync -aL rsync://samples.libav.org:/samples/fate-suite/ fate-suite +# rsync -aL rsync://fate-suite.libav.org:/fate-suite/ fate-suite To inform the build system about the testsuite location, pass `--samples=` to configure or set the SAMPLES Make -- cgit v1.2.3 From e0b33d479cf1cb96e4300b82309e26e6f9c50d6c Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 15 Apr 2011 19:22:42 -0400 Subject: ac3enc: simplify stereo rematrixing decision options --- doc/encoders.texi | 12 ++++++++++++ libavcodec/ac3enc.c | 48 +++++++++++++----------------------------------- 2 files changed, 25 insertions(+), 35 deletions(-) (limited to 'doc') diff --git a/doc/encoders.texi b/doc/encoders.texi index 59337e2abe..2f3cecde66 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -353,4 +353,16 @@ HDCD A/D Converter @end table +@subheading Other AC-3 Encoding Options + +@table @option + +@item -stereo_rematrixing @var{boolean} +Stereo Rematrixing. Enables/Disables use of rematrixing for stereo input. This +is an optional AC-3 feature that increases quality by selectively encoding +the left/right channels as mid/side. This option is enabled by default, and it +is highly recommended that it be left as enabled except for testing purposes. + +@end table + @c man end ENCODERS diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 1f3c92aa3d..55f065bda1 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -52,12 +52,6 @@ /** Maximum number of exponent groups. +1 for separate DC exponent. */ #define AC3_MAX_EXP_GROUPS 85 -/* stereo rematrixing algorithms */ -#define AC3_REMATRIXING_IS_STATIC 0x1 -#define AC3_REMATRIXING_SUMS 0 -#define AC3_REMATRIXING_NONE 1 -#define AC3_REMATRIXING_ALWAYS 3 - #if CONFIG_AC3ENC_FLOAT #define MAC_COEF(d,a,b) ((d)+=(a)*(b)) typedef float SampleType; @@ -103,6 +97,7 @@ typedef struct AC3EncOptions { /* other encoding options */ int allow_per_frame_metadata; + int stereo_rematrixing; } AC3EncOptions; /** @@ -170,7 +165,7 @@ typedef struct AC3EncodeContext { int bandwidth_code[AC3_MAX_CHANNELS]; ///< bandwidth code (0 to 60) (chbwcod) int nb_coefs[AC3_MAX_CHANNELS]; - int rematrixing; ///< determines how rematrixing strategy is calculated + int rematrixing_enabled; ///< stereo rematrixing enabled int num_rematrixing_bands; ///< number of rematrixing bands /* bitrate allocation control */ @@ -269,6 +264,8 @@ static const AVOption options[] = { {"ad_conv_type", "A/D Converter Type", OFFSET(ad_converter_type), FF_OPT_TYPE_INT, -1, -1, 1, AC3ENC_PARAM, "ad_conv_type"}, {"standard", "Standard (default)", 0, FF_OPT_TYPE_CONST, 0, INT_MIN, INT_MAX, AC3ENC_PARAM, "ad_conv_type"}, {"hdcd", "HDCD", 0, FF_OPT_TYPE_CONST, 1, INT_MIN, INT_MAX, AC3ENC_PARAM, "ad_conv_type"}, +/* Other Encoding Options */ +{"stereo_rematrixing", "Stereo Rematrixing", OFFSET(stereo_rematrixing), FF_OPT_TYPE_INT, 1, 0, 1, AC3ENC_PARAM}, {NULL} }; @@ -430,28 +427,6 @@ static void apply_mdct(AC3EncodeContext *s) } -/** - * Initialize stereo rematrixing. - * If the strategy does not change for each frame, set the rematrixing flags. - */ -static void rematrixing_init(AC3EncodeContext *s) -{ - if (s->channel_mode == AC3_CHMODE_STEREO) - s->rematrixing = AC3_REMATRIXING_SUMS; - else - s->rematrixing = AC3_REMATRIXING_NONE; - /* NOTE: AC3_REMATRIXING_ALWAYS might be used in - the future in conjunction with channel coupling. */ - - if (s->rematrixing & AC3_REMATRIXING_IS_STATIC) { - int flag = (s->rematrixing == AC3_REMATRIXING_ALWAYS); - s->blocks[0].new_rematrixing_strategy = 1; - memset(s->blocks[0].rematrixing_flags, flag, - sizeof(s->blocks[0].rematrixing_flags)); - } -} - - /** * Determine rematrixing flags for each block and band. */ @@ -461,16 +436,18 @@ static void compute_rematrixing_strategy(AC3EncodeContext *s) int blk, bnd, i; AC3Block *block, *block0; - s->num_rematrixing_bands = 4; - - if (s->rematrixing & AC3_REMATRIXING_IS_STATIC) + if (s->channel_mode != AC3_CHMODE_STEREO) return; + s->num_rematrixing_bands = 4; + nb_coefs = FFMIN(s->nb_coefs[0], s->nb_coefs[1]); for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { block = &s->blocks[blk]; block->new_rematrixing_strategy = !blk; + if (!s->rematrixing_enabled) + continue; for (bnd = 0; bnd < s->num_rematrixing_bands; bnd++) { /* calculate calculate sum of squared coeffs for one band in one block */ int start = ff_ac3_rematrix_band_tab[bnd]; @@ -514,7 +491,7 @@ static void apply_rematrixing(AC3EncodeContext *s) int start, end; uint8_t *flags; - if (s->rematrixing == AC3_REMATRIXING_NONE) + if (!s->rematrixing_enabled) return; nb_coefs = FFMIN(s->nb_coefs[0], s->nb_coefs[1]); @@ -2088,6 +2065,9 @@ static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s) if (ret) return ret; + s->rematrixing_enabled = s->options.stereo_rematrixing && + (s->channel_mode == AC3_CHMODE_STEREO); + return 0; } @@ -2246,8 +2226,6 @@ static av_cold int ac3_encode_init(AVCodecContext *avctx) set_bandwidth(s); - rematrixing_init(s); - exponent_init(s); bit_alloc_init(s); -- cgit v1.2.3 From e27ce0eea36b7631ad26a8f41b93855e3ae7e8f9 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Sat, 26 Mar 2011 15:12:35 +1100 Subject: DPX image encoder --- Changelog | 2 + doc/general.texi | 2 +- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 2 +- libavcodec/dpxenc.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++++ libavcodec/version.h | 4 +- 6 files changed, 185 insertions(+), 4 deletions(-) create mode 100644 libavcodec/dpxenc.c (limited to 'doc') diff --git a/Changelog b/Changelog index 144f55c12f..b5ceea9444 100644 --- a/Changelog +++ b/Changelog @@ -6,6 +6,8 @@ version : - Lots of deprecated API cruft removed - fft and imdct optimizations for AVX (Sandy Bridge) processors +- DPX image encoder + version 0.7_beta1: diff --git a/doc/general.texi b/doc/general.texi index e68e83e5f2..598b9bc873 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -279,7 +279,7 @@ following image formats are supported: @tab Only uncompressed GIFs are generated. @item BMP @tab X @tab X @tab Microsoft BMP image -@item DPX @tab @tab X +@item DPX @tab X @tab X @tab Digital Picture Exchange @item JPEG @tab X @tab X @tab Progressive JPEG is not supported. diff --git a/libavcodec/Makefile b/libavcodec/Makefile index fad435dee3..1b704126dd 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -110,6 +110,7 @@ OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o \ ratecontrol.o mpeg12data.o \ mpegvideo.o OBJS-$(CONFIG_DPX_DECODER) += dpx.o +OBJS-$(CONFIG_DPX_ENCODER) += dpxenc.o OBJS-$(CONFIG_DSICINAUDIO_DECODER) += dsicinav.o OBJS-$(CONFIG_DSICINVIDEO_DECODER) += dsicinav.o OBJS-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 40a7e23388..694674ce7b 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -90,7 +90,7 @@ void avcodec_register_all(void) REGISTER_DECODER (CYUV, cyuv); REGISTER_DECODER (DFA, dfa); REGISTER_ENCDEC (DNXHD, dnxhd); - REGISTER_DECODER (DPX, dpx); + REGISTER_ENCDEC (DPX, dpx); REGISTER_DECODER (DSICINVIDEO, dsicinvideo); REGISTER_ENCDEC (DVVIDEO, dvvideo); REGISTER_DECODER (DXA, dxa); diff --git a/libavcodec/dpxenc.c b/libavcodec/dpxenc.c new file mode 100644 index 0000000000..bb783e2d9c --- /dev/null +++ b/libavcodec/dpxenc.c @@ -0,0 +1,178 @@ +/* + * DPX (.dpx) image encoder + * Copyright (c) 2011 Peter Ross + * + * 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 "libavutil/intreadwrite.h" +#include "libavutil/imgutils.h" +#include "avcodec.h" + +typedef struct DPXContext { + AVFrame picture; + int big_endian; + int bits_per_component; + int descriptor; +} DPXContext; + +static av_cold int encode_init(AVCodecContext *avctx) +{ + DPXContext *s = avctx->priv_data; + + avctx->coded_frame = &s->picture; + avctx->coded_frame->pict_type = FF_I_TYPE; + avctx->coded_frame->key_frame = 1; + + s->big_endian = 1; + s->bits_per_component = 8; + s->descriptor = 50; /* RGB */ + + switch (avctx->pix_fmt) { + case PIX_FMT_RGB24: + break; + case PIX_FMT_RGBA: + s->descriptor = 51; /* RGBA */ + break; + case PIX_FMT_RGB48LE: + s->big_endian = 0; + case PIX_FMT_RGB48BE: + s->bits_per_component = avctx->bits_per_raw_sample ? avctx->bits_per_raw_sample : 16; + break; + default: + av_log(avctx, AV_LOG_INFO, "unsupported pixel format\n"); + return -1; + } + + return 0; +} + +#define write16(p, value) \ +do { \ + if (s->big_endian) AV_WB16(p, value); \ + else AV_WL16(p, value); \ +} while(0) + +#define write32(p, value) \ +do { \ + if (s->big_endian) AV_WB32(p, value); \ + else AV_WL32(p, value); \ +} while(0) + +static void encode_rgb48_10bit(AVCodecContext *avctx, const AVPicture *pic, + uint8_t *dst) +{ + DPXContext *s = avctx->priv_data; + const uint8_t *src = pic->data[0]; + int x, y; + + for (y = 0; y < avctx->height; y++) { + for (x = 0; x < avctx->width; x++) { + int value; + if ((avctx->pix_fmt & 1)) { + value = ((AV_RB16(src + 6*x + 4) & 0xFFC0) >> 4) + | ((AV_RB16(src + 6*x + 2) & 0xFFC0) << 6) + | ((AV_RB16(src + 6*x + 0) & 0xFFC0) << 16); + } else { + value = ((AV_RL16(src + 6*x + 4) & 0xFFC0) >> 4) + | ((AV_RL16(src + 6*x + 2) & 0xFFC0) << 6) + | ((AV_RL16(src + 6*x + 0) & 0xFFC0) << 16); + } + write32(dst, value); + dst += 4; + } + src += pic->linesize[0]; + } +} + +static int encode_frame(AVCodecContext *avctx, unsigned char *buf, + int buf_size, void *data) +{ + DPXContext *s = avctx->priv_data; + int size; + +#define HEADER_SIZE 1664 /* DPX Generic header */ + if (buf_size < HEADER_SIZE) + return -1; + + memset(buf, 0, HEADER_SIZE); + + /* File information header */ + write32(buf, MKBETAG('S','D','P','X')); + write32(buf + 4, HEADER_SIZE); + memcpy (buf + 8, "V1.0", 4); + write32(buf + 20, 1); /* new image */ + write32(buf + 24, HEADER_SIZE); + memcpy (buf + 160, LIBAVCODEC_IDENT, FFMIN(sizeof(LIBAVCODEC_IDENT), 100)); + write32(buf + 660, 0xFFFFFFFF); /* unencrypted */ + + /* Image information header */ + write16(buf + 768, 0); /* orientation; left to right, top to bottom */ + write16(buf + 770, 1); /* number of elements */ + write32(buf + 772, avctx->width); + write32(buf + 776, avctx->height); + buf[800] = s->descriptor; + buf[801] = 2; /* linear transfer */ + buf[802] = 2; /* linear colorimetric */ + buf[803] = s->bits_per_component; + write16(buf + 804, s->bits_per_component == 10 ? 1 : 0); /* packing method */ + + /* Image source information header */ + write32(buf + 1628, avctx->sample_aspect_ratio.num); + write32(buf + 1632, avctx->sample_aspect_ratio.den); + + switch (s->bits_per_component) { + case 8: + case 16: + size = avpicture_layout(data, avctx->pix_fmt, + avctx->width, avctx->height, + buf + HEADER_SIZE, buf_size - HEADER_SIZE); + if (size < 0) + return size; + break; + case 10: + size = avctx->height * avctx->width * 4; + if (buf_size < HEADER_SIZE + size) + return -1; + encode_rgb48_10bit(avctx, data, buf + HEADER_SIZE); + break; + default: + av_log(avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n", s->bits_per_component); + return -1; + } + + size += HEADER_SIZE; + + write32(buf + 16, size); /* file size */ + return size; +} + +AVCodec ff_dpx_encoder = { + .name = "dpx", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_DPX, + .priv_data_size = sizeof(DPXContext), + .init = encode_init, + .decode = encode_frame, + .pix_fmts = (const enum PixelFormat[]){ + PIX_FMT_RGB24, + PIX_FMT_RGBA, + PIX_FMT_RGB48LE, + PIX_FMT_RGB48BE, + PIX_FMT_NONE}, + .long_name = NULL_IF_CONFIG_SMALL("DPX image"), +}; diff --git a/libavcodec/version.h b/libavcodec/version.h index 418e2756b9..d840fbe81f 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -21,8 +21,8 @@ #define AVCODEC_VERSION_H #define LIBAVCODEC_VERSION_MAJOR 53 -#define LIBAVCODEC_VERSION_MINOR 1 -#define LIBAVCODEC_VERSION_MICRO 1 +#define LIBAVCODEC_VERSION_MINOR 2 +#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ -- cgit v1.2.3