summaryrefslogtreecommitdiff
path: root/libavcodec/dpxenc.c
diff options
context:
space:
mode:
authorGeorg Lippitsch <georg.lippitsch@gmx.at>2012-10-12 21:18:50 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-10-13 00:31:21 +0200
commit24778c32d80e4045401e4c09ea3f9c12c431167e (patch)
tree7531ecd05984c34ab94951cd6c56f2385432d198 /libavcodec/dpxenc.c
parent05b7315412c3500edd525aa6e7f972f970dc692d (diff)
Fix writing 12 bit DPX
The DPX encoder now writes 12 DPX that open correctly (tested with ImageMagick), and also correspond to the 12 bit sample files at http://samples.ffmpeg.org/image-samples/dpx_samples.zip Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/dpxenc.c')
-rw-r--r--libavcodec/dpxenc.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/libavcodec/dpxenc.c b/libavcodec/dpxenc.c
index 8ef057f949..9b2cc6f94e 100644
--- a/libavcodec/dpxenc.c
+++ b/libavcodec/dpxenc.c
@@ -104,7 +104,7 @@ static void encode_rgb48_10bit(AVCodecContext *avctx, const AVPicture *pic, uint
for (y = 0; y < avctx->height; y++) {
for (x = 0; x < avctx->width; x++) {
int value;
- if ((avctx->pix_fmt & 1)) {
+ if (s->big_endian) {
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);
@@ -129,7 +129,7 @@ static void encode_gbrp10(AVCodecContext *avctx, const AVPicture *pic, uint8_t *
for (y = 0; y < avctx->height; y++) {
for (x = 0; x < avctx->width; x++) {
int value;
- if ((avctx->pix_fmt & 1)) {
+ if (s->big_endian) {
value = (AV_RB16(src[0] + 2*x) << 12)
| (AV_RB16(src[1] + 2*x) << 2)
| (AV_RB16(src[2] + 2*x) << 22);
@@ -148,14 +148,25 @@ static void encode_gbrp10(AVCodecContext *avctx, const AVPicture *pic, uint8_t *
static void encode_gbrp12(AVCodecContext *avctx, const AVPicture *pic, uint16_t *dst)
{
+ DPXContext *s = avctx->priv_data;
const uint16_t *src[3] = {(uint16_t*)pic->data[0],
(uint16_t*)pic->data[1],
(uint16_t*)pic->data[2]};
int x, y, i;
for (y = 0; y < avctx->height; y++) {
for (x = 0; x < avctx->width; x++) {
+ uint16_t value[3];
+ if (s->big_endian) {
+ value[1] = AV_RB16(src[0] + x) << 4;
+ value[2] = AV_RB16(src[1] + x) << 4;
+ value[0] = AV_RB16(src[2] + x) << 4;
+ } else {
+ value[1] = AV_RL16(src[0] + x) << 4;
+ value[2] = AV_RL16(src[1] + x) << 4;
+ value[0] = AV_RL16(src[2] + x) << 4;
+ }
for (i = 0; i < 3; i++)
- *dst++ = *(src[i] + x);
+ write16(dst++, value[i]);
}
for (i = 0; i < 3; i++)
src[i] += pic->linesize[i]/2;