aboutsummaryrefslogtreecommitdiffstats
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
parent05b7315412c3500edd525aa6e7f972f970dc692d (diff)
downloadffmpeg-24778c32d80e4045401e4c09ea3f9c12c431167e.tar.gz
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>
-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;