2 * DPX (.dpx) image encoder
3 * Copyright (c) 2011 Peter Ross <pross@xvid.org>
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/intreadwrite.h"
23 #include "libavutil/imgutils.h"
27 typedef struct DPXContext
{
30 int bits_per_component
;
34 static av_cold
int encode_init(AVCodecContext
*avctx
)
36 DPXContext
*s
= avctx
->priv_data
;
38 avctx
->coded_frame
= &s
->picture
;
39 avctx
->coded_frame
->pict_type
= AV_PICTURE_TYPE_I
;
40 avctx
->coded_frame
->key_frame
= 1;
43 s
->bits_per_component
= 8;
44 s
->descriptor
= 50; /* RGB */
46 switch (avctx
->pix_fmt
) {
50 s
->descriptor
= 51; /* RGBA */
55 s
->bits_per_component
= avctx
->bits_per_raw_sample
? avctx
->bits_per_raw_sample
: 16;
58 av_log(avctx
, AV_LOG_INFO
, "unsupported pixel format\n");
65 #define write16(p, value) \
67 if (s->big_endian) AV_WB16(p, value); \
68 else AV_WL16(p, value); \
71 #define write32(p, value) \
73 if (s->big_endian) AV_WB32(p, value); \
74 else AV_WL32(p, value); \
77 static void encode_rgb48_10bit(AVCodecContext
*avctx
, const AVPicture
*pic
,
80 DPXContext
*s
= avctx
->priv_data
;
81 const uint8_t *src
= pic
->data
[0];
84 for (y
= 0; y
< avctx
->height
; y
++) {
85 for (x
= 0; x
< avctx
->width
; x
++) {
87 if ((avctx
->pix_fmt
& 1)) {
88 value
= ((AV_RB16(src
+ 6*x
+ 4) & 0xFFC0) >> 4)
89 | ((AV_RB16(src
+ 6*x
+ 2) & 0xFFC0) << 6)
90 | ((AV_RB16(src
+ 6*x
+ 0) & 0xFFC0) << 16);
92 value
= ((AV_RL16(src
+ 6*x
+ 4) & 0xFFC0) >> 4)
93 | ((AV_RL16(src
+ 6*x
+ 2) & 0xFFC0) << 6)
94 | ((AV_RL16(src
+ 6*x
+ 0) & 0xFFC0) << 16);
99 src
+= pic
->linesize
[0];
103 static int encode_frame(AVCodecContext
*avctx
, AVPacket
*pkt
,
104 const AVFrame
*frame
, int *got_packet
)
106 DPXContext
*s
= avctx
->priv_data
;
110 #define HEADER_SIZE 1664 /* DPX Generic header */
111 if (s
->bits_per_component
== 10)
112 size
= avctx
->height
* avctx
->width
* 4;
114 size
= avpicture_get_size(avctx
->pix_fmt
, avctx
->width
, avctx
->height
);
115 if ((ret
= ff_alloc_packet(pkt
, size
+ HEADER_SIZE
)) < 0) {
116 av_log(avctx
, AV_LOG_ERROR
, "Error getting output packet.\n");
121 memset(buf
, 0, HEADER_SIZE
);
123 /* File information header */
124 write32(buf
, MKBETAG('S','D','P','X'));
125 write32(buf
+ 4, HEADER_SIZE
);
126 memcpy (buf
+ 8, "V1.0", 4);
127 write32(buf
+ 20, 1); /* new image */
128 write32(buf
+ 24, HEADER_SIZE
);
129 if (!(avctx
->flags
& CODEC_FLAG_BITEXACT
))
130 memcpy (buf
+ 160, LIBAVCODEC_IDENT
, FFMIN(sizeof(LIBAVCODEC_IDENT
), 100));
131 write32(buf
+ 660, 0xFFFFFFFF); /* unencrypted */
133 /* Image information header */
134 write16(buf
+ 768, 0); /* orientation; left to right, top to bottom */
135 write16(buf
+ 770, 1); /* number of elements */
136 write32(buf
+ 772, avctx
->width
);
137 write32(buf
+ 776, avctx
->height
);
138 buf
[800] = s
->descriptor
;
139 buf
[801] = 2; /* linear transfer */
140 buf
[802] = 2; /* linear colorimetric */
141 buf
[803] = s
->bits_per_component
;
142 write16(buf
+ 804, s
->bits_per_component
== 10 ? 1 : 0); /* packing method */
144 /* Image source information header */
145 write32(buf
+ 1628, avctx
->sample_aspect_ratio
.num
);
146 write32(buf
+ 1632, avctx
->sample_aspect_ratio
.den
);
148 switch (s
->bits_per_component
) {
151 size
= avpicture_layout((const AVPicture
*)frame
, avctx
->pix_fmt
,
152 avctx
->width
, avctx
->height
,
153 buf
+ HEADER_SIZE
, pkt
->size
- HEADER_SIZE
);
158 encode_rgb48_10bit(avctx
, (const AVPicture
*)frame
, buf
+ HEADER_SIZE
);
161 av_log(avctx
, AV_LOG_ERROR
, "Unsupported bit depth: %d\n", s
->bits_per_component
);
167 write32(buf
+ 16, size
); /* file size */
169 pkt
->flags
|= AV_PKT_FLAG_KEY
;
175 AVCodec ff_dpx_encoder
= {
177 .type
= AVMEDIA_TYPE_VIDEO
,
179 .priv_data_size
= sizeof(DPXContext
),
181 .encode2
= encode_frame
,
182 .pix_fmts
= (const enum PixelFormat
[]){
188 .long_name
= NULL_IF_CONFIG_SMALL("DPX image"),