summaryrefslogtreecommitdiff
path: root/libavcodec/dpxenc.c
diff options
context:
space:
mode:
authorPeter Ross <pross@xvid.org>2011-04-02 15:59:28 +1100
committerMichael Niedermayer <michaelni@gmx.at>2011-04-02 18:30:08 +0200
commit4ec720059cc1ddfa849c4d199f4fd974d8ab5d92 (patch)
tree1db57e2e1dc51da0123ef79a550f509f6acd2389 /libavcodec/dpxenc.c
parent1b5282a221b9e9544c3807b56335d577eedda264 (diff)
dpx encoder: support 10-bit packing method
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/dpxenc.c')
-rw-r--r--libavcodec/dpxenc.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/libavcodec/dpxenc.c b/libavcodec/dpxenc.c
index 8c631e51ef..eeae1894ca 100644
--- a/libavcodec/dpxenc.c
+++ b/libavcodec/dpxenc.c
@@ -73,6 +73,31 @@ do { \
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;
@@ -102,16 +127,31 @@ static int encode_frame(AVCodecContext *avctx, unsigned char *buf, int buf_size,
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((AVPicture*)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, (AVPicture*)data, buf + HEADER_SIZE);
+ break;
+ default:
+ av_log(avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n", bits_per_component);
+ return -1;
+ }
size += HEADER_SIZE;