2 * Copyright (c) 2015-2016 Kieran Kunhya <kieran@kunhya.com>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * Cineform HD video decoder
26 #include "libavutil/attributes.h"
27 #include "libavutil/common.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/mem.h"
30 #include "libavutil/pixdesc.h"
33 #include "bytestream.h"
34 #include "codec_internal.h"
41 #define ALPHA_COMPAND_DC_OFFSET 256
42 #define ALPHA_COMPAND_GAIN 9400
44 static av_cold
int cfhd_init(AVCodecContext
*avctx
)
46 CFHDContext
*s
= avctx
->priv_data
;
50 for (int i
= 0; i
< 64; i
++) {
68 for (int i
= 0; i
< 256; i
++)
69 s
->lut
[1][i
] = i
+ ((768LL * i
* i
* i
) / (256 * 256 * 256));
71 return ff_cfhd_init_vlcs(s
);
74 static void init_plane_defaults(CFHDContext
*s
)
78 s
->subband_num_actual
= 0;
81 static void init_peak_table_defaults(CFHDContext
*s
)
85 memset(&s
->peak
.base
, 0, sizeof(s
->peak
.base
));
88 static void init_frame_defaults(CFHDContext
*s
)
92 s
->coded_format
= AV_PIX_FMT_YUV422P10
;
93 s
->cropped_height
= 0;
96 s
->subband_cnt
= SUBBAND_COUNT
;
98 s
->lowpass_precision
= 16;
101 s
->difference_coding
= 0;
104 if (s
->transform_type
!= 2)
105 s
->transform_type
= -1;
106 init_plane_defaults(s
);
107 init_peak_table_defaults(s
);
110 static inline int dequant_and_decompand(CFHDContext
*s
, int level
, int quantisation
, int codebook
)
112 if (codebook
== 0 || codebook
== 1) {
113 return s
->lut
[codebook
][abs(level
)] * FFSIGN(level
) * quantisation
;
115 return level
* quantisation
;
118 static inline void difference_coding(int16_t *band
, int width
, int height
)
122 for (i
= 0; i
< height
; i
++) {
123 for (j
= 1; j
< width
; j
++) {
124 band
[j
] += band
[j
-1];
130 static inline void peak_table(int16_t *band
, Peak
*peak
, int length
)
133 for (i
= 0; i
< length
; i
++)
134 if (abs(band
[i
]) > peak
->level
)
135 band
[i
] = bytestream2_get_le16(&peak
->base
);
138 static inline void process_alpha(int16_t *alpha
, int width
)
141 for (i
= 0; i
< width
; i
++) {
143 channel
-= ALPHA_COMPAND_DC_OFFSET
;
145 channel
*= ALPHA_COMPAND_GAIN
;
147 channel
= av_clip_uintp2(channel
, 12);
152 static inline void process_bayer(AVFrame
*frame
, int bpc
)
154 const int linesize
= frame
->linesize
[0];
155 uint16_t *r
= (uint16_t *)frame
->data
[0];
156 uint16_t *g1
= (uint16_t *)(frame
->data
[0] + 2);
157 uint16_t *g2
= (uint16_t *)(frame
->data
[0] + frame
->linesize
[0]);
158 uint16_t *b
= (uint16_t *)(frame
->data
[0] + frame
->linesize
[0] + 2);
159 const int mid
= 1 << (bpc
- 1);
160 const int factor
= 1 << (16 - bpc
);
162 for (int y
= 0; y
< frame
->height
>> 1; y
++) {
163 for (int x
= 0; x
< frame
->width
; x
+= 2) {
173 R
= (rg
- mid
) * 2 + g
;
176 B
= (bg
- mid
) * 2 + g
;
178 R
= av_clip_uintp2(R
* factor
, 16);
179 G1
= av_clip_uintp2(G1
* factor
, 16);
180 G2
= av_clip_uintp2(G2
* factor
, 16);
181 B
= av_clip_uintp2(B
* factor
, 16);
196 static inline void interlaced_vertical_filter(int16_t *output
, int16_t *low
, int16_t *high
,
197 int width
, int linesize
, int plane
)
201 for (i
= 0; i
< width
; i
++) {
202 even
= (low
[i
] - high
[i
])/2;
203 odd
= (low
[i
] + high
[i
])/2;
204 output
[i
] = av_clip_uintp2(even
, 10);
205 output
[i
+ linesize
] = av_clip_uintp2(odd
, 10);
209 static inline void inverse_temporal_filter(int16_t *low
, int16_t *high
, int width
)
211 for (int i
= 0; i
< width
; i
++) {
212 int even
= (low
[i
] - high
[i
]) / 2;
213 int odd
= (low
[i
] + high
[i
]) / 2;
220 static void free_buffers(CFHDContext
*s
)
224 for (i
= 0; i
< FF_ARRAY_ELEMS(s
->plane
); i
++) {
225 Plane
*p
= &s
->plane
[i
];
226 av_freep(&s
->plane
[i
].idwt_buf
);
227 av_freep(&s
->plane
[i
].idwt_tmp
);
228 s
->plane
[i
].idwt_size
= 0;
230 for (j
= 0; j
< SUBBAND_COUNT_3D
; j
++)
231 s
->plane
[i
].subband
[j
] = NULL
;
233 for (j
= 0; j
< 10; j
++)
234 s
->plane
[i
].l_h
[j
] = NULL
;
236 for (j
= 0; j
< DWT_LEVELS_3D
; j
++)
237 p
->band
[j
][0].read_ok
=
238 p
->band
[j
][1].read_ok
=
239 p
->band
[j
][2].read_ok
=
240 p
->band
[j
][3].read_ok
= 0;
244 s
->a_transform_type
= INT_MIN
;
247 static int alloc_buffers(AVCodecContext
*avctx
)
249 CFHDContext
*s
= avctx
->priv_data
;
250 int i
, j
, ret
, planes
, bayer
= 0;
251 int chroma_x_shift
, chroma_y_shift
;
254 if ((ret
= ff_set_dimensions(avctx
, s
->coded_width
, s
->coded_height
)) < 0)
256 avctx
->pix_fmt
= s
->coded_format
;
258 ff_cfhddsp_init(&s
->dsp
, s
->bpc
, avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
);
260 if ((ret
= av_pix_fmt_get_chroma_sub_sample(s
->coded_format
,
262 &chroma_y_shift
)) < 0)
264 planes
= av_pix_fmt_count_planes(s
->coded_format
);
265 if (s
->coded_format
== AV_PIX_FMT_BAYER_RGGB16
) {
272 for (i
= 0; i
< planes
; i
++) {
273 int w8
, h8
, w4
, h4
, w2
, h2
;
274 int width
= (i
|| bayer
) ? s
->coded_width
>> chroma_x_shift
: s
->coded_width
;
275 int height
= (i
|| bayer
) ? s
->coded_height
>> chroma_y_shift
: s
->coded_height
;
276 ptrdiff_t stride
= (FFALIGN(width
/ 8, 8) + 64) * 8;
278 if (chroma_y_shift
&& !bayer
)
279 height
= FFALIGN(height
/ 8, 2) * 8;
280 s
->plane
[i
].width
= width
;
281 s
->plane
[i
].height
= height
;
282 s
->plane
[i
].stride
= stride
;
284 w8
= FFALIGN(s
->plane
[i
].width
/ 8, 8) + 64;
285 h8
= FFALIGN(height
, 8) / 8;
291 if (s
->transform_type
== 0) {
292 s
->plane
[i
].idwt_size
= FFALIGN(height
, 8) * stride
;
293 s
->plane
[i
].idwt_buf
=
294 av_calloc(s
->plane
[i
].idwt_size
, sizeof(*s
->plane
[i
].idwt_buf
));
295 s
->plane
[i
].idwt_tmp
=
296 av_malloc_array(s
->plane
[i
].idwt_size
, sizeof(*s
->plane
[i
].idwt_tmp
));
298 s
->plane
[i
].idwt_size
= FFALIGN(height
, 8) * stride
* 2;
299 s
->plane
[i
].idwt_buf
=
300 av_calloc(s
->plane
[i
].idwt_size
, sizeof(*s
->plane
[i
].idwt_buf
));
301 s
->plane
[i
].idwt_tmp
=
302 av_malloc_array(s
->plane
[i
].idwt_size
, sizeof(*s
->plane
[i
].idwt_tmp
));
305 if (!s
->plane
[i
].idwt_buf
|| !s
->plane
[i
].idwt_tmp
)
306 return AVERROR(ENOMEM
);
308 s
->plane
[i
].subband
[0] = s
->plane
[i
].idwt_buf
;
309 s
->plane
[i
].subband
[1] = s
->plane
[i
].idwt_buf
+ 2 * w8
* h8
;
310 s
->plane
[i
].subband
[2] = s
->plane
[i
].idwt_buf
+ 1 * w8
* h8
;
311 s
->plane
[i
].subband
[3] = s
->plane
[i
].idwt_buf
+ 3 * w8
* h8
;
312 s
->plane
[i
].subband
[4] = s
->plane
[i
].idwt_buf
+ 2 * w4
* h4
;
313 s
->plane
[i
].subband
[5] = s
->plane
[i
].idwt_buf
+ 1 * w4
* h4
;
314 s
->plane
[i
].subband
[6] = s
->plane
[i
].idwt_buf
+ 3 * w4
* h4
;
315 if (s
->transform_type
== 0) {
316 s
->plane
[i
].subband
[7] = s
->plane
[i
].idwt_buf
+ 2 * w2
* h2
;
317 s
->plane
[i
].subband
[8] = s
->plane
[i
].idwt_buf
+ 1 * w2
* h2
;
318 s
->plane
[i
].subband
[9] = s
->plane
[i
].idwt_buf
+ 3 * w2
* h2
;
321 s
->plane
[i
].subband
[7] = s
->plane
[i
].idwt_buf
+ 4 * w2
* h2
;
322 s
->plane
[i
].subband
[8] = frame2
+ 2 * w4
* h4
;
323 s
->plane
[i
].subband
[9] = frame2
+ 1 * w4
* h4
;
324 s
->plane
[i
].subband
[10] = frame2
+ 3 * w4
* h4
;
325 s
->plane
[i
].subband
[11] = frame2
+ 2 * w2
* h2
;
326 s
->plane
[i
].subband
[12] = frame2
+ 1 * w2
* h2
;
327 s
->plane
[i
].subband
[13] = frame2
+ 3 * w2
* h2
;
328 s
->plane
[i
].subband
[14] = s
->plane
[i
].idwt_buf
+ 2 * w2
* h2
;
329 s
->plane
[i
].subband
[15] = s
->plane
[i
].idwt_buf
+ 1 * w2
* h2
;
330 s
->plane
[i
].subband
[16] = s
->plane
[i
].idwt_buf
+ 3 * w2
* h2
;
333 if (s
->transform_type
== 0) {
334 for (j
= 0; j
< DWT_LEVELS
; j
++) {
335 for (k
= 0; k
< FF_ARRAY_ELEMS(s
->plane
[i
].band
[j
]); k
++) {
336 s
->plane
[i
].band
[j
][k
].a_width
= w8
<< j
;
337 s
->plane
[i
].band
[j
][k
].a_height
= h8
<< j
;
341 for (j
= 0; j
< DWT_LEVELS_3D
; j
++) {
342 int t
= j
< 1 ? 0 : (j
< 3 ? 1 : 2);
344 for (k
= 0; k
< FF_ARRAY_ELEMS(s
->plane
[i
].band
[j
]); k
++) {
345 s
->plane
[i
].band
[j
][k
].a_width
= w8
<< t
;
346 s
->plane
[i
].band
[j
][k
].a_height
= h8
<< t
;
351 /* ll2 and ll1 commented out because they are done in-place */
352 s
->plane
[i
].l_h
[0] = s
->plane
[i
].idwt_tmp
;
353 s
->plane
[i
].l_h
[1] = s
->plane
[i
].idwt_tmp
+ 2 * w8
* h8
;
354 // s->plane[i].l_h[2] = ll2;
355 s
->plane
[i
].l_h
[3] = s
->plane
[i
].idwt_tmp
;
356 s
->plane
[i
].l_h
[4] = s
->plane
[i
].idwt_tmp
+ 2 * w4
* h4
;
357 // s->plane[i].l_h[5] = ll1;
358 s
->plane
[i
].l_h
[6] = s
->plane
[i
].idwt_tmp
;
359 s
->plane
[i
].l_h
[7] = s
->plane
[i
].idwt_tmp
+ 2 * w2
* h2
;
360 if (s
->transform_type
!= 0) {
361 int16_t *frame2
= s
->plane
[i
].idwt_tmp
+ 4 * w2
* h2
;
363 s
->plane
[i
].l_h
[8] = frame2
;
364 s
->plane
[i
].l_h
[9] = frame2
+ 2 * w2
* h2
;
368 s
->a_transform_type
= s
->transform_type
;
369 s
->a_height
= s
->coded_height
;
370 s
->a_width
= s
->coded_width
;
371 s
->a_format
= s
->coded_format
;
376 static int cfhd_decode(AVCodecContext
*avctx
, AVFrame
*pic
,
377 int *got_frame
, AVPacket
*avpkt
)
379 CFHDContext
*s
= avctx
->priv_data
;
380 CFHDDSPContext
*dsp
= &s
->dsp
;
382 int ret
= 0, i
, j
, plane
, got_buffer
= 0;
385 init_frame_defaults(s
);
386 s
->planes
= av_pix_fmt_count_planes(s
->coded_format
);
388 bytestream2_init(&gb
, avpkt
->data
, avpkt
->size
);
390 while (bytestream2_get_bytes_left(&gb
) >= 4) {
391 /* Bit weird but implement the tag parsing as the spec says */
392 uint16_t tagu
= bytestream2_get_be16(&gb
);
393 int16_t tag
= (int16_t)tagu
;
394 int8_t tag8
= (int8_t)(tagu
>> 8);
395 uint16_t abstag
= abs(tag
);
396 int8_t abs_tag8
= abs(tag8
);
397 uint16_t data
= bytestream2_get_be16(&gb
);
398 if (abs_tag8
>= 0x60 && abs_tag8
<= 0x6f) {
399 av_log(avctx
, AV_LOG_DEBUG
, "large len %x\n", ((tagu
& 0xff) << 16) | data
);
400 } else if (tag
== SampleFlags
) {
401 av_log(avctx
, AV_LOG_DEBUG
, "Progressive? %"PRIu16
"\n", data
);
402 s
->progressive
= data
& 0x0001;
403 } else if (tag
== FrameType
) {
404 s
->frame_type
= data
;
405 av_log(avctx
, AV_LOG_DEBUG
, "Frame type %"PRIu16
"\n", data
);
406 } else if (abstag
== VersionMajor
) {
407 av_log(avctx
, AV_LOG_DEBUG
, "Version major %"PRIu16
"\n", data
);
408 } else if (abstag
== VersionMinor
) {
409 av_log(avctx
, AV_LOG_DEBUG
, "Version minor %"PRIu16
"\n", data
);
410 } else if (abstag
== VersionRevision
) {
411 av_log(avctx
, AV_LOG_DEBUG
, "Version revision %"PRIu16
"\n", data
);
412 } else if (abstag
== VersionEdit
) {
413 av_log(avctx
, AV_LOG_DEBUG
, "Version edit %"PRIu16
"\n", data
);
414 } else if (abstag
== Version
) {
415 av_log(avctx
, AV_LOG_DEBUG
, "Version %"PRIu16
"\n", data
);
416 } else if (tag
== ImageWidth
) {
417 av_log(avctx
, AV_LOG_DEBUG
, "Width %"PRIu16
"\n", data
);
418 s
->coded_width
= data
;
419 } else if (tag
== ImageHeight
) {
420 av_log(avctx
, AV_LOG_DEBUG
, "Height %"PRIu16
"\n", data
);
421 s
->coded_height
= data
;
422 } else if (tag
== ChannelCount
) {
423 av_log(avctx
, AV_LOG_DEBUG
, "Channel Count: %"PRIu16
"\n", data
);
424 s
->channel_cnt
= data
;
426 av_log(avctx
, AV_LOG_ERROR
, "Channel Count of %"PRIu16
" is unsupported\n", data
);
427 ret
= AVERROR_PATCHWELCOME
;
430 } else if (tag
== SubbandCount
) {
431 av_log(avctx
, AV_LOG_DEBUG
, "Subband Count: %"PRIu16
"\n", data
);
432 if (data
!= SUBBAND_COUNT
&& data
!= SUBBAND_COUNT_3D
) {
433 av_log(avctx
, AV_LOG_ERROR
, "Subband Count of %"PRIu16
" is unsupported\n", data
);
434 ret
= AVERROR_PATCHWELCOME
;
437 } else if (tag
== ChannelNumber
) {
438 s
->channel_num
= data
;
439 av_log(avctx
, AV_LOG_DEBUG
, "Channel number %"PRIu16
"\n", data
);
440 if (s
->channel_num
>= s
->planes
) {
441 av_log(avctx
, AV_LOG_ERROR
, "Invalid channel number\n");
442 ret
= AVERROR(EINVAL
);
445 init_plane_defaults(s
);
446 } else if (tag
== SubbandNumber
) {
447 if (s
->subband_num
!= 0 && data
== 1 && (s
->transform_type
== 0 || s
->transform_type
== 2)) // hack
449 av_log(avctx
, AV_LOG_DEBUG
, "Subband number %"PRIu16
"\n", data
);
450 s
->subband_num
= data
;
451 if ((s
->transform_type
== 0 && s
->level
>= DWT_LEVELS
) ||
452 (s
->transform_type
== 2 && s
->level
>= DWT_LEVELS_3D
)) {
453 av_log(avctx
, AV_LOG_ERROR
, "Invalid level\n");
454 ret
= AVERROR(EINVAL
);
457 if (s
->subband_num
> 3) {
458 av_log(avctx
, AV_LOG_ERROR
, "Invalid subband number\n");
459 ret
= AVERROR(EINVAL
);
462 } else if (tag
== SubbandBand
) {
463 av_log(avctx
, AV_LOG_DEBUG
, "Subband number actual %"PRIu16
"\n", data
);
464 if ((s
->transform_type
== 0 && data
>= SUBBAND_COUNT
) ||
465 (s
->transform_type
== 2 && data
>= SUBBAND_COUNT_3D
&& data
!= 255)) {
466 av_log(avctx
, AV_LOG_ERROR
, "Invalid subband number actual\n");
467 ret
= AVERROR(EINVAL
);
470 if (s
->transform_type
== 0 || s
->transform_type
== 2)
471 s
->subband_num_actual
= data
;
473 av_log(avctx
, AV_LOG_WARNING
, "Ignoring subband num actual %"PRIu16
"\n", data
);
474 } else if (tag
== LowpassPrecision
)
475 av_log(avctx
, AV_LOG_DEBUG
, "Lowpass precision bits: %"PRIu16
"\n", data
);
476 else if (tag
== Quantization
) {
477 s
->quantisation
= data
;
478 av_log(avctx
, AV_LOG_DEBUG
, "Quantisation: %"PRIu16
"\n", data
);
479 } else if (tag
== PrescaleTable
) {
480 for (i
= 0; i
< 8; i
++)
481 s
->prescale_table
[i
] = (data
>> (14 - i
* 2)) & 0x3;
482 av_log(avctx
, AV_LOG_DEBUG
, "Prescale table: %x\n", data
);
483 } else if (tag
== BandEncoding
) {
484 if (!data
|| data
> 5) {
485 av_log(avctx
, AV_LOG_ERROR
, "Invalid band encoding\n");
486 ret
= AVERROR(EINVAL
);
489 s
->band_encoding
= data
;
490 av_log(avctx
, AV_LOG_DEBUG
, "Encode Method for Subband %d : %x\n", s
->subband_num_actual
, data
);
491 } else if (tag
== LowpassWidth
) {
492 av_log(avctx
, AV_LOG_DEBUG
, "Lowpass width %"PRIu16
"\n", data
);
493 s
->plane
[s
->channel_num
].band
[0][0].width
= data
;
494 s
->plane
[s
->channel_num
].band
[0][0].stride
= data
;
495 } else if (tag
== LowpassHeight
) {
496 av_log(avctx
, AV_LOG_DEBUG
, "Lowpass height %"PRIu16
"\n", data
);
497 s
->plane
[s
->channel_num
].band
[0][0].height
= data
;
498 } else if (tag
== SampleType
) {
499 s
->sample_type
= data
;
500 av_log(avctx
, AV_LOG_DEBUG
, "Sample type? %"PRIu16
"\n", data
);
501 } else if (tag
== TransformType
) {
503 av_log(avctx
, AV_LOG_ERROR
, "Invalid transform type\n");
504 ret
= AVERROR(EINVAL
);
506 } else if (data
== 1) {
507 av_log(avctx
, AV_LOG_ERROR
, "unsupported transform type\n");
508 ret
= AVERROR_PATCHWELCOME
;
511 if (s
->transform_type
== -1) {
512 s
->transform_type
= data
;
513 av_log(avctx
, AV_LOG_DEBUG
, "Transform type %"PRIu16
"\n", data
);
515 av_log(avctx
, AV_LOG_DEBUG
, "Ignoring additional transform type %"PRIu16
"\n", data
);
517 } else if (abstag
>= 0x4000 && abstag
<= 0x40ff) {
518 if (abstag
== 0x4001)
520 av_log(avctx
, AV_LOG_DEBUG
, "Small chunk length %d %s\n", data
* 4, tag
< 0 ? "optional" : "required");
521 bytestream2_skipu(&gb
, data
* 4);
522 } else if (tag
== FrameIndex
) {
523 av_log(avctx
, AV_LOG_DEBUG
, "Frame index %"PRIu16
"\n", data
);
524 s
->frame_index
= data
;
525 } else if (tag
== SampleIndexTable
) {
526 av_log(avctx
, AV_LOG_DEBUG
, "Sample index table - skipping %i values\n", data
);
527 if (data
> bytestream2_get_bytes_left(&gb
) / 4) {
528 av_log(avctx
, AV_LOG_ERROR
, "too many values (%d)\n", data
);
529 ret
= AVERROR_INVALIDDATA
;
532 for (i
= 0; i
< data
; i
++) {
533 uint32_t offset
= bytestream2_get_be32(&gb
);
534 av_log(avctx
, AV_LOG_DEBUG
, "Offset = %"PRIu32
"\n", offset
);
536 } else if (tag
== HighpassWidth
) {
537 av_log(avctx
, AV_LOG_DEBUG
, "Highpass width %i channel %i level %i subband %i\n", data
, s
->channel_num
, s
->level
, s
->subband_num
);
539 av_log(avctx
, AV_LOG_ERROR
, "Invalid highpass width\n");
540 ret
= AVERROR(EINVAL
);
543 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].width
= data
;
544 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].stride
= FFALIGN(data
, 8);
545 } else if (tag
== HighpassHeight
) {
546 av_log(avctx
, AV_LOG_DEBUG
, "Highpass height %i\n", data
);
548 av_log(avctx
, AV_LOG_ERROR
, "Invalid highpass height\n");
549 ret
= AVERROR(EINVAL
);
552 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].height
= data
;
553 } else if (tag
== BandWidth
) {
554 av_log(avctx
, AV_LOG_DEBUG
, "Highpass width2 %i\n", data
);
556 av_log(avctx
, AV_LOG_ERROR
, "Invalid highpass width2\n");
557 ret
= AVERROR(EINVAL
);
560 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].width
= data
;
561 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].stride
= FFALIGN(data
, 8);
562 } else if (tag
== BandHeight
) {
563 av_log(avctx
, AV_LOG_DEBUG
, "Highpass height2 %i\n", data
);
565 av_log(avctx
, AV_LOG_ERROR
, "Invalid highpass height2\n");
566 ret
= AVERROR(EINVAL
);
569 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].height
= data
;
570 } else if (tag
== InputFormat
) {
571 av_log(avctx
, AV_LOG_DEBUG
, "Input format %i\n", data
);
572 if (s
->coded_format
== AV_PIX_FMT_NONE
||
573 s
->coded_format
== AV_PIX_FMT_YUV422P10
) {
574 if (data
>= 100 && data
<= 105) {
575 s
->coded_format
= AV_PIX_FMT_BAYER_RGGB16
;
576 } else if (data
>= 122 && data
<= 128) {
577 s
->coded_format
= AV_PIX_FMT_GBRP12
;
578 } else if (data
== 30) {
579 s
->coded_format
= AV_PIX_FMT_GBRAP12
;
581 s
->coded_format
= AV_PIX_FMT_YUV422P10
;
583 s
->planes
= s
->coded_format
== AV_PIX_FMT_BAYER_RGGB16
? 4 : av_pix_fmt_count_planes(s
->coded_format
);
585 } else if (tag
== BandCodingFlags
) {
586 s
->codebook
= data
& 0xf;
587 s
->difference_coding
= (data
>> 4) & 1;
588 av_log(avctx
, AV_LOG_DEBUG
, "Other codebook? %i\n", s
->codebook
);
589 } else if (tag
== Precision
) {
590 av_log(avctx
, AV_LOG_DEBUG
, "Precision %i\n", data
);
591 if (!(data
== 10 || data
== 12)) {
592 av_log(avctx
, AV_LOG_ERROR
, "Invalid bits per channel\n");
593 ret
= AVERROR(EINVAL
);
596 avctx
->bits_per_raw_sample
= s
->bpc
= data
;
597 } else if (tag
== EncodedFormat
) {
598 av_log(avctx
, AV_LOG_DEBUG
, "Sample format? %i\n", data
);
600 s
->coded_format
= AV_PIX_FMT_YUV422P10
;
601 } else if (data
== 2) {
602 s
->coded_format
= AV_PIX_FMT_BAYER_RGGB16
;
603 } else if (data
== 3) {
604 s
->coded_format
= AV_PIX_FMT_GBRP12
;
605 } else if (data
== 4) {
606 s
->coded_format
= AV_PIX_FMT_GBRAP12
;
608 avpriv_report_missing_feature(avctx
, "Sample format of %"PRIu16
, data
);
609 ret
= AVERROR_PATCHWELCOME
;
612 s
->planes
= data
== 2 ? 4 : av_pix_fmt_count_planes(s
->coded_format
);
613 } else if (tag
== -DisplayHeight
) {
614 av_log(avctx
, AV_LOG_DEBUG
, "Cropped height %"PRIu16
"\n", data
);
615 s
->cropped_height
= data
;
616 } else if (tag
== -PeakOffsetLow
) {
617 s
->peak
.offset
&= ~0xffff;
618 s
->peak
.offset
|= (data
& 0xffff);
621 } else if (tag
== -PeakOffsetHigh
) {
622 s
->peak
.offset
&= 0xffff;
623 s
->peak
.offset
|= (data
& 0xffffU
)<<16;
626 } else if (tag
== -PeakLevel
&& s
->peak
.offset
) {
627 s
->peak
.level
= data
;
628 if (s
->peak
.offset
< 4 - bytestream2_tell(&s
->peak
.base
) ||
629 s
->peak
.offset
> 4 + bytestream2_get_bytes_left(&s
->peak
.base
)
631 ret
= AVERROR_INVALIDDATA
;
634 bytestream2_seek(&s
->peak
.base
, s
->peak
.offset
- 4, SEEK_CUR
);
636 av_log(avctx
, AV_LOG_DEBUG
, "Unknown tag %i data %x\n", tag
, data
);
638 if (tag
== BitstreamMarker
&& data
== 0xf0f &&
639 s
->coded_format
!= AV_PIX_FMT_NONE
) {
640 int lowpass_height
= s
->plane
[s
->channel_num
].band
[0][0].height
;
641 int lowpass_width
= s
->plane
[s
->channel_num
].band
[0][0].width
;
642 int factor
= s
->coded_format
== AV_PIX_FMT_BAYER_RGGB16
? 2 : 1;
644 if (s
->coded_width
) {
645 s
->coded_width
*= factor
;
648 if (s
->coded_height
) {
649 s
->coded_height
*= factor
;
652 if (!s
->a_width
&& !s
->coded_width
) {
653 s
->coded_width
= lowpass_width
* factor
* 8;
656 if (!s
->a_height
&& !s
->coded_height
) {
657 s
->coded_height
= lowpass_height
* factor
* 8;
660 if (s
->a_width
&& !s
->coded_width
)
661 s
->coded_width
= s
->a_width
;
662 if (s
->a_height
&& !s
->coded_height
)
663 s
->coded_height
= s
->a_height
;
665 if (s
->a_width
!= s
->coded_width
|| s
->a_height
!= s
->coded_height
||
666 s
->a_format
!= s
->coded_format
||
667 s
->transform_type
!= s
->a_transform_type
) {
669 if ((ret
= alloc_buffers(avctx
)) < 0) {
674 ret
= ff_set_dimensions(avctx
, s
->coded_width
, s
->coded_height
);
677 if (s
->cropped_height
) {
678 unsigned height
= s
->cropped_height
<< (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
);
679 if (avctx
->height
< height
)
680 return AVERROR_INVALIDDATA
;
681 avctx
->height
= height
;
683 pic
->width
= pic
->height
= 0;
685 if ((ret
= ff_thread_get_buffer(avctx
, pic
, 0)) < 0)
690 s
->coded_format
= AV_PIX_FMT_NONE
;
692 } else if (tag
== FrameIndex
&& data
== 1 && s
->sample_type
== 1 && s
->frame_type
== 2) {
693 pic
->width
= pic
->height
= 0;
695 if ((ret
= ff_thread_get_buffer(avctx
, pic
, 0)) < 0)
699 s
->coded_format
= AV_PIX_FMT_NONE
;
703 if (s
->subband_num_actual
== 255)
705 coeff_data
= s
->plane
[s
->channel_num
].subband
[s
->subband_num_actual
];
707 /* Lowpass coefficients */
708 if (tag
== BitstreamMarker
&& data
== 0xf0f) {
709 int lowpass_height
, lowpass_width
, lowpass_a_height
, lowpass_a_width
;
711 if (!s
->a_width
|| !s
->a_height
) {
712 ret
= AVERROR_INVALIDDATA
;
716 lowpass_height
= s
->plane
[s
->channel_num
].band
[0][0].height
;
717 lowpass_width
= s
->plane
[s
->channel_num
].band
[0][0].width
;
718 lowpass_a_height
= s
->plane
[s
->channel_num
].band
[0][0].a_height
;
719 lowpass_a_width
= s
->plane
[s
->channel_num
].band
[0][0].a_width
;
721 if (lowpass_width
< 3 ||
722 lowpass_width
> lowpass_a_width
) {
723 av_log(avctx
, AV_LOG_ERROR
, "Invalid lowpass width\n");
724 ret
= AVERROR(EINVAL
);
728 if (lowpass_height
< 3 ||
729 lowpass_height
> lowpass_a_height
) {
730 av_log(avctx
, AV_LOG_ERROR
, "Invalid lowpass height\n");
731 ret
= AVERROR(EINVAL
);
736 av_log(avctx
, AV_LOG_ERROR
, "No end of header tag found\n");
737 ret
= AVERROR(EINVAL
);
741 if (lowpass_height
> lowpass_a_height
|| lowpass_width
> lowpass_a_width
||
742 lowpass_width
* lowpass_height
* sizeof(int16_t) > bytestream2_get_bytes_left(&gb
)) {
743 av_log(avctx
, AV_LOG_ERROR
, "Too many lowpass coefficients\n");
744 ret
= AVERROR(EINVAL
);
748 av_log(avctx
, AV_LOG_DEBUG
, "Start of lowpass coeffs component %d height:%d, width:%d\n", s
->channel_num
, lowpass_height
, lowpass_width
);
749 for (i
= 0; i
< lowpass_height
; i
++) {
750 for (j
= 0; j
< lowpass_width
; j
++)
751 coeff_data
[j
] = bytestream2_get_be16u(&gb
);
753 coeff_data
+= lowpass_width
;
756 /* Align to mod-4 position to continue reading tags */
757 bytestream2_seek(&gb
, bytestream2_tell(&gb
) & 3, SEEK_CUR
);
759 /* Copy last line of coefficients if odd height */
760 if (lowpass_height
& 1) {
761 memcpy(&coeff_data
[lowpass_height
* lowpass_width
],
762 &coeff_data
[(lowpass_height
- 1) * lowpass_width
],
763 lowpass_width
* sizeof(*coeff_data
));
766 s
->plane
[s
->channel_num
].band
[0][0].read_ok
= 1;
768 av_log(avctx
, AV_LOG_DEBUG
, "Lowpass coefficients %d\n", lowpass_width
* lowpass_height
);
771 av_assert0(s
->subband_num_actual
!= 255);
772 if (tag
== BandHeader
|| tag
== BandSecondPass
) {
773 int highpass_height
, highpass_width
, highpass_a_width
, highpass_a_height
, highpass_stride
, a_expected
;
775 int level
, run
, coeff
;
776 int count
= 0, bytes
;
778 if (!s
->a_width
|| !s
->a_height
) {
779 ret
= AVERROR_INVALIDDATA
;
783 highpass_height
= s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].height
;
784 highpass_width
= s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].width
;
785 highpass_a_width
= s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].a_width
;
786 highpass_a_height
= s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].a_height
;
787 highpass_stride
= s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].stride
;
788 a_expected
= highpass_a_height
* highpass_a_width
;
791 av_log(avctx
, AV_LOG_ERROR
, "No end of header tag found\n");
792 ret
= AVERROR(EINVAL
);
796 if (highpass_height
> highpass_a_height
|| highpass_width
> highpass_a_width
|| a_expected
< highpass_height
* (uint64_t)highpass_stride
) {
797 av_log(avctx
, AV_LOG_ERROR
, "Too many highpass coefficients\n");
798 ret
= AVERROR(EINVAL
);
801 expected
= highpass_height
* highpass_stride
;
803 av_log(avctx
, AV_LOG_DEBUG
, "Start subband coeffs plane %i level %i codebook %i expected %i\n", s
->channel_num
, s
->level
, s
->codebook
, expected
);
805 ret
= init_get_bits8(&s
->gb
, gb
.buffer
, bytestream2_get_bytes_left(&gb
));
809 OPEN_READER(re
, &s
->gb
);
811 const int lossless
= s
->band_encoding
== 5;
813 if (s
->codebook
== 0 && s
->transform_type
== 2 && s
->subband_num_actual
== 7)
817 UPDATE_CACHE(re
, &s
->gb
);
818 GET_RL_VLC(level
, run
, re
, &s
->gb
, s
->table_9_rl_vlc
,
827 if (count
> expected
)
831 coeff
= dequant_and_decompand(s
, level
, s
->quantisation
, 0);
834 if (tag
== BandSecondPass
) {
835 const uint16_t q
= s
->quantisation
;
837 for (i
= 0; i
< run
; i
++) {
838 *coeff_data
|= coeff
* 256U;
842 for (i
= 0; i
< run
; i
++)
843 *coeff_data
++ = coeff
;
848 UPDATE_CACHE(re
, &s
->gb
);
849 GET_RL_VLC(level
, run
, re
, &s
->gb
, s
->table_18_rl_vlc
,
858 if (count
> expected
)
862 coeff
= dequant_and_decompand(s
, level
, s
->quantisation
, s
->codebook
);
865 if (tag
== BandSecondPass
) {
866 const uint16_t q
= s
->quantisation
;
868 for (i
= 0; i
< run
; i
++) {
869 *coeff_data
|= coeff
* 256U;
873 for (i
= 0; i
< run
; i
++)
874 *coeff_data
++ = coeff
;
878 CLOSE_READER(re
, &s
->gb
);
881 if (count
> expected
) {
882 av_log(avctx
, AV_LOG_ERROR
, "Escape codeword not found, probably corrupt data\n");
883 ret
= AVERROR(EINVAL
);
887 peak_table(coeff_data
- count
, &s
->peak
, count
);
888 if (s
->difference_coding
)
889 difference_coding(s
->plane
[s
->channel_num
].subband
[s
->subband_num_actual
], highpass_width
, highpass_height
);
891 bytes
= FFALIGN(AV_CEIL_RSHIFT(get_bits_count(&s
->gb
), 3), 4);
892 if (bytes
> bytestream2_get_bytes_left(&gb
)) {
893 av_log(avctx
, AV_LOG_ERROR
, "Bitstream overread error\n");
894 ret
= AVERROR(EINVAL
);
897 bytestream2_seek(&gb
, bytes
, SEEK_CUR
);
899 av_log(avctx
, AV_LOG_DEBUG
, "End subband coeffs %i extra %i\n", count
, count
- expected
);
900 s
->plane
[s
->channel_num
].band
[s
->level
][s
->subband_num
].read_ok
= 1;
902 if (s
->subband_num_actual
!= 255)
907 s
->planes
= av_pix_fmt_count_planes(avctx
->pix_fmt
);
908 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
913 ff_thread_finish_setup(avctx
);
915 if (!s
->a_width
|| !s
->a_height
|| s
->a_format
== AV_PIX_FMT_NONE
||
916 s
->a_transform_type
== INT_MIN
||
917 s
->coded_width
|| s
->coded_height
|| s
->coded_format
!= AV_PIX_FMT_NONE
) {
918 av_log(avctx
, AV_LOG_ERROR
, "Invalid dimensions\n");
919 ret
= AVERROR(EINVAL
);
924 av_log(avctx
, AV_LOG_ERROR
, "No end of header tag found\n");
925 ret
= AVERROR(EINVAL
);
929 for (plane
= 0; plane
< s
->planes
; plane
++) {
932 for (level
= 0; level
< (s
->transform_type
== 0 ? DWT_LEVELS
: DWT_LEVELS_3D
) ; level
++) {
933 if (s
->transform_type
== 2)
934 if (level
== 2 || level
== 5)
936 for (o
= !!level
; o
< 4 ; o
++) {
937 if (!s
->plane
[plane
].band
[level
][o
].read_ok
) {
938 ret
= AVERROR_INVALIDDATA
;
945 if (s
->transform_type
== 0 && s
->sample_type
!= 1) {
946 for (plane
= 0; plane
< s
->planes
&& !ret
; plane
++) {
948 int lowpass_height
= s
->plane
[plane
].band
[0][0].height
;
949 int output_stride
= s
->plane
[plane
].band
[0][0].a_width
;
950 int lowpass_width
= s
->plane
[plane
].band
[0][0].width
;
951 int highpass_stride
= s
->plane
[plane
].band
[0][1].stride
;
952 int act_plane
= plane
== 1 ? 2 : plane
== 2 ? 1 : plane
;
953 ptrdiff_t dst_linesize
;
954 int16_t *low
, *high
, *output
, *dst
;
956 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
958 dst_linesize
= pic
->linesize
[act_plane
];
960 dst_linesize
= pic
->linesize
[act_plane
] / 2;
963 if (lowpass_height
> s
->plane
[plane
].band
[0][0].a_height
|| lowpass_width
> s
->plane
[plane
].band
[0][0].a_width
||
964 !highpass_stride
|| s
->plane
[plane
].band
[0][1].width
> s
->plane
[plane
].band
[0][1].a_width
||
965 lowpass_width
< 3 || lowpass_height
< 3) {
966 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
967 ret
= AVERROR(EINVAL
);
971 av_log(avctx
, AV_LOG_DEBUG
, "Decoding level 1 plane %i %i %i %i\n", plane
, lowpass_height
, lowpass_width
, highpass_stride
);
973 low
= s
->plane
[plane
].subband
[0];
974 high
= s
->plane
[plane
].subband
[2];
975 output
= s
->plane
[plane
].l_h
[0];
976 dsp
->vert_filter(output
, output_stride
, low
, lowpass_width
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
978 low
= s
->plane
[plane
].subband
[1];
979 high
= s
->plane
[plane
].subband
[3];
980 output
= s
->plane
[plane
].l_h
[1];
982 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
984 low
= s
->plane
[plane
].l_h
[0];
985 high
= s
->plane
[plane
].l_h
[1];
986 output
= s
->plane
[plane
].subband
[0];
987 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, output_stride
, lowpass_width
, lowpass_height
* 2);
989 output
= s
->plane
[plane
].subband
[0];
990 for (i
= 0; i
< lowpass_height
* 2; i
++) {
991 for (j
= 0; j
< lowpass_width
* 2; j
++)
994 output
+= output_stride
* 2;
999 lowpass_height
= s
->plane
[plane
].band
[1][1].height
;
1000 output_stride
= s
->plane
[plane
].band
[1][1].a_width
;
1001 lowpass_width
= s
->plane
[plane
].band
[1][1].width
;
1002 highpass_stride
= s
->plane
[plane
].band
[1][1].stride
;
1004 if (lowpass_height
> s
->plane
[plane
].band
[1][1].a_height
|| lowpass_width
> s
->plane
[plane
].band
[1][1].a_width
||
1005 !highpass_stride
|| s
->plane
[plane
].band
[1][1].width
> s
->plane
[plane
].band
[1][1].a_width
||
1006 lowpass_width
< 3 || lowpass_height
< 3) {
1007 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
1008 ret
= AVERROR(EINVAL
);
1012 av_log(avctx
, AV_LOG_DEBUG
, "Level 2 plane %i %i %i %i\n", plane
, lowpass_height
, lowpass_width
, highpass_stride
);
1014 low
= s
->plane
[plane
].subband
[0];
1015 high
= s
->plane
[plane
].subband
[5];
1016 output
= s
->plane
[plane
].l_h
[3];
1017 dsp
->vert_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1019 low
= s
->plane
[plane
].subband
[4];
1020 high
= s
->plane
[plane
].subband
[6];
1021 output
= s
->plane
[plane
].l_h
[4];
1022 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1024 low
= s
->plane
[plane
].l_h
[3];
1025 high
= s
->plane
[plane
].l_h
[4];
1026 output
= s
->plane
[plane
].subband
[0];
1027 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, output_stride
, lowpass_width
, lowpass_height
* 2);
1029 output
= s
->plane
[plane
].subband
[0];
1030 for (i
= 0; i
< lowpass_height
* 2; i
++) {
1031 for (j
= 0; j
< lowpass_width
* 2; j
++)
1034 output
+= output_stride
* 2;
1038 lowpass_height
= s
->plane
[plane
].band
[2][1].height
;
1039 output_stride
= s
->plane
[plane
].band
[2][1].a_width
;
1040 lowpass_width
= s
->plane
[plane
].band
[2][1].width
;
1041 highpass_stride
= s
->plane
[plane
].band
[2][1].stride
;
1043 if (lowpass_height
> s
->plane
[plane
].band
[2][1].a_height
|| lowpass_width
> s
->plane
[plane
].band
[2][1].a_width
||
1044 !highpass_stride
|| s
->plane
[plane
].band
[2][1].width
> s
->plane
[plane
].band
[2][1].a_width
||
1045 lowpass_height
< 3 || lowpass_width
< 3 || lowpass_width
* 2 > s
->plane
[plane
].width
) {
1046 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
1047 ret
= AVERROR(EINVAL
);
1051 av_log(avctx
, AV_LOG_DEBUG
, "Level 3 plane %i %i %i %i\n", plane
, lowpass_height
, lowpass_width
, highpass_stride
);
1052 if (s
->progressive
) {
1053 low
= s
->plane
[plane
].subband
[0];
1054 high
= s
->plane
[plane
].subband
[8];
1055 output
= s
->plane
[plane
].l_h
[6];
1056 dsp
->vert_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1058 low
= s
->plane
[plane
].subband
[7];
1059 high
= s
->plane
[plane
].subband
[9];
1060 output
= s
->plane
[plane
].l_h
[7];
1061 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1063 dst
= (int16_t *)pic
->data
[act_plane
];
1064 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
1068 dst
+= pic
->linesize
[act_plane
] >> 1;
1070 low
= s
->plane
[plane
].l_h
[6];
1071 high
= s
->plane
[plane
].l_h
[7];
1073 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
&&
1074 (lowpass_height
* 2 > avctx
->coded_height
/ 2 ||
1075 lowpass_width
* 2 > avctx
->coded_width
/ 2 )
1077 ret
= AVERROR_INVALIDDATA
;
1081 for (i
= 0; i
< s
->plane
[act_plane
].height
; i
++) {
1082 dsp
->horiz_filter_clip(dst
, low
, high
, lowpass_width
, s
->bpc
);
1083 if (avctx
->pix_fmt
== AV_PIX_FMT_GBRAP12
&& act_plane
== 3)
1084 process_alpha(dst
, lowpass_width
* 2);
1085 low
+= output_stride
;
1086 high
+= output_stride
;
1087 dst
+= dst_linesize
;
1090 av_log(avctx
, AV_LOG_DEBUG
, "interlaced frame ? %d", !!(pic
->flags
& AV_FRAME_FLAG_INTERLACED
));
1091 pic
->flags
|= AV_FRAME_FLAG_INTERLACED
;
1092 low
= s
->plane
[plane
].subband
[0];
1093 high
= s
->plane
[plane
].subband
[7];
1094 output
= s
->plane
[plane
].l_h
[6];
1095 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1097 low
= s
->plane
[plane
].subband
[8];
1098 high
= s
->plane
[plane
].subband
[9];
1099 output
= s
->plane
[plane
].l_h
[7];
1100 dsp
->horiz_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1102 dst
= (int16_t *)pic
->data
[act_plane
];
1103 low
= s
->plane
[plane
].l_h
[6];
1104 high
= s
->plane
[plane
].l_h
[7];
1105 for (i
= 0; i
< s
->plane
[act_plane
].height
/ 2; i
++) {
1106 interlaced_vertical_filter(dst
, low
, high
, lowpass_width
* 2, pic
->linesize
[act_plane
]/2, act_plane
);
1107 low
+= output_stride
* 2;
1108 high
+= output_stride
* 2;
1109 dst
+= pic
->linesize
[act_plane
];
1113 } else if (s
->transform_type
== 2 && (avctx
->internal
->is_copy
|| s
->frame_index
== 1 || s
->sample_type
!= 1)) {
1114 for (plane
= 0; plane
< s
->planes
&& !ret
; plane
++) {
1115 int lowpass_height
= s
->plane
[plane
].band
[0][0].height
;
1116 int output_stride
= s
->plane
[plane
].band
[0][0].a_width
;
1117 int lowpass_width
= s
->plane
[plane
].band
[0][0].width
;
1118 int highpass_stride
= s
->plane
[plane
].band
[0][1].stride
;
1119 int act_plane
= plane
== 1 ? 2 : plane
== 2 ? 1 : plane
;
1120 int16_t *low
, *high
, *output
, *dst
;
1121 ptrdiff_t dst_linesize
;
1123 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
1125 dst_linesize
= pic
->linesize
[act_plane
];
1127 dst_linesize
= pic
->linesize
[act_plane
] / 2;
1130 if (lowpass_height
> s
->plane
[plane
].band
[0][0].a_height
|| lowpass_width
> s
->plane
[plane
].band
[0][0].a_width
||
1131 !highpass_stride
|| s
->plane
[plane
].band
[0][1].width
> s
->plane
[plane
].band
[0][1].a_width
||
1132 lowpass_width
< 3 || lowpass_height
< 3) {
1133 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
1134 ret
= AVERROR(EINVAL
);
1138 av_log(avctx
, AV_LOG_DEBUG
, "Decoding level 1 plane %i %i %i %i\n", plane
, lowpass_height
, lowpass_width
, highpass_stride
);
1140 low
= s
->plane
[plane
].subband
[0];
1141 high
= s
->plane
[plane
].subband
[2];
1142 output
= s
->plane
[plane
].l_h
[0];
1143 dsp
->vert_filter(output
, output_stride
, low
, lowpass_width
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1145 low
= s
->plane
[plane
].subband
[1];
1146 high
= s
->plane
[plane
].subband
[3];
1147 output
= s
->plane
[plane
].l_h
[1];
1148 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1150 low
= s
->plane
[plane
].l_h
[0];
1151 high
= s
->plane
[plane
].l_h
[1];
1152 output
= s
->plane
[plane
].l_h
[7];
1153 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, output_stride
, lowpass_width
, lowpass_height
* 2);
1155 output
= s
->plane
[plane
].l_h
[7];
1156 for (i
= 0; i
< lowpass_height
* 2; i
++) {
1157 for (j
= 0; j
< lowpass_width
* 2; j
++)
1160 output
+= output_stride
* 2;
1164 lowpass_height
= s
->plane
[plane
].band
[1][1].height
;
1165 output_stride
= s
->plane
[plane
].band
[1][1].a_width
;
1166 lowpass_width
= s
->plane
[plane
].band
[1][1].width
;
1167 highpass_stride
= s
->plane
[plane
].band
[1][1].stride
;
1169 if (lowpass_height
> s
->plane
[plane
].band
[1][1].a_height
|| lowpass_width
> s
->plane
[plane
].band
[1][1].a_width
||
1170 !highpass_stride
|| s
->plane
[plane
].band
[1][1].width
> s
->plane
[plane
].band
[1][1].a_width
||
1171 lowpass_width
< 3 || lowpass_height
< 3) {
1172 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
1173 ret
= AVERROR(EINVAL
);
1177 av_log(avctx
, AV_LOG_DEBUG
, "Level 2 lowpass plane %i %i %i %i\n", plane
, lowpass_height
, lowpass_width
, highpass_stride
);
1179 low
= s
->plane
[plane
].l_h
[7];
1180 high
= s
->plane
[plane
].subband
[5];
1181 output
= s
->plane
[plane
].l_h
[3];
1182 dsp
->vert_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1184 low
= s
->plane
[plane
].subband
[4];
1185 high
= s
->plane
[plane
].subband
[6];
1186 output
= s
->plane
[plane
].l_h
[4];
1187 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1189 low
= s
->plane
[plane
].l_h
[3];
1190 high
= s
->plane
[plane
].l_h
[4];
1191 output
= s
->plane
[plane
].l_h
[7];
1192 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, output_stride
, lowpass_width
, lowpass_height
* 2);
1194 output
= s
->plane
[plane
].l_h
[7];
1195 for (i
= 0; i
< lowpass_height
* 2; i
++) {
1196 for (j
= 0; j
< lowpass_width
* 2; j
++)
1198 output
+= output_stride
* 2;
1201 low
= s
->plane
[plane
].subband
[7];
1202 high
= s
->plane
[plane
].subband
[9];
1203 output
= s
->plane
[plane
].l_h
[3];
1204 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1206 low
= s
->plane
[plane
].subband
[8];
1207 high
= s
->plane
[plane
].subband
[10];
1208 output
= s
->plane
[plane
].l_h
[4];
1209 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1211 low
= s
->plane
[plane
].l_h
[3];
1212 high
= s
->plane
[plane
].l_h
[4];
1213 output
= s
->plane
[plane
].l_h
[9];
1214 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, output_stride
, lowpass_width
, lowpass_height
* 2);
1216 lowpass_height
= s
->plane
[plane
].band
[4][1].height
;
1217 output_stride
= s
->plane
[plane
].band
[4][1].a_width
;
1218 lowpass_width
= s
->plane
[plane
].band
[4][1].width
;
1219 highpass_stride
= s
->plane
[plane
].band
[4][1].stride
;
1220 av_log(avctx
, AV_LOG_DEBUG
, "temporal level %i %i %i %i\n", plane
, lowpass_height
, lowpass_width
, highpass_stride
);
1222 if (lowpass_height
> s
->plane
[plane
].band
[4][1].a_height
|| lowpass_width
> s
->plane
[plane
].band
[4][1].a_width
||
1223 !highpass_stride
|| s
->plane
[plane
].band
[4][1].width
> s
->plane
[plane
].band
[4][1].a_width
||
1224 lowpass_width
< 3 || lowpass_height
< 3) {
1225 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
1226 ret
= AVERROR(EINVAL
);
1230 low
= s
->plane
[plane
].l_h
[7];
1231 high
= s
->plane
[plane
].l_h
[9];
1232 output
= s
->plane
[plane
].l_h
[7];
1233 for (i
= 0; i
< lowpass_height
; i
++) {
1234 inverse_temporal_filter(low
, high
, lowpass_width
);
1235 low
+= output_stride
;
1236 high
+= output_stride
;
1238 if (s
->progressive
) {
1239 low
= s
->plane
[plane
].l_h
[7];
1240 high
= s
->plane
[plane
].subband
[15];
1241 output
= s
->plane
[plane
].l_h
[6];
1242 dsp
->vert_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1244 low
= s
->plane
[plane
].subband
[14];
1245 high
= s
->plane
[plane
].subband
[16];
1246 output
= s
->plane
[plane
].l_h
[7];
1247 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1249 low
= s
->plane
[plane
].l_h
[9];
1250 high
= s
->plane
[plane
].subband
[12];
1251 output
= s
->plane
[plane
].l_h
[8];
1252 dsp
->vert_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1254 low
= s
->plane
[plane
].subband
[11];
1255 high
= s
->plane
[plane
].subband
[13];
1256 output
= s
->plane
[plane
].l_h
[9];
1257 dsp
->vert_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1259 if (s
->sample_type
== 1)
1262 dst
= (int16_t *)pic
->data
[act_plane
];
1263 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
1267 dst
+= pic
->linesize
[act_plane
] >> 1;
1270 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
&&
1271 (lowpass_height
* 2 > avctx
->coded_height
/ 2 ||
1272 lowpass_width
* 2 > avctx
->coded_width
/ 2 )
1274 ret
= AVERROR_INVALIDDATA
;
1278 low
= s
->plane
[plane
].l_h
[6];
1279 high
= s
->plane
[plane
].l_h
[7];
1280 for (i
= 0; i
< s
->plane
[act_plane
].height
; i
++) {
1281 dsp
->horiz_filter_clip(dst
, low
, high
, lowpass_width
, s
->bpc
);
1282 low
+= output_stride
;
1283 high
+= output_stride
;
1284 dst
+= dst_linesize
;
1287 pic
->flags
|= AV_FRAME_FLAG_INTERLACED
;
1288 low
= s
->plane
[plane
].l_h
[7];
1289 high
= s
->plane
[plane
].subband
[14];
1290 output
= s
->plane
[plane
].l_h
[6];
1291 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1293 low
= s
->plane
[plane
].subband
[15];
1294 high
= s
->plane
[plane
].subband
[16];
1295 output
= s
->plane
[plane
].l_h
[7];
1296 dsp
->horiz_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1298 low
= s
->plane
[plane
].l_h
[9];
1299 high
= s
->plane
[plane
].subband
[11];
1300 output
= s
->plane
[plane
].l_h
[8];
1301 dsp
->horiz_filter(output
, output_stride
, low
, output_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1303 low
= s
->plane
[plane
].subband
[12];
1304 high
= s
->plane
[plane
].subband
[13];
1305 output
= s
->plane
[plane
].l_h
[9];
1306 dsp
->horiz_filter(output
, output_stride
, low
, highpass_stride
, high
, highpass_stride
, lowpass_width
, lowpass_height
);
1308 if (s
->sample_type
== 1)
1311 dst
= (int16_t *)pic
->data
[act_plane
];
1312 low
= s
->plane
[plane
].l_h
[6];
1313 high
= s
->plane
[plane
].l_h
[7];
1314 for (i
= 0; i
< s
->plane
[act_plane
].height
/ 2; i
++) {
1315 interlaced_vertical_filter(dst
, low
, high
, lowpass_width
* 2, pic
->linesize
[act_plane
]/2, act_plane
);
1316 low
+= output_stride
* 2;
1317 high
+= output_stride
* 2;
1318 dst
+= pic
->linesize
[act_plane
];
1324 if (s
->transform_type
== 2 && s
->sample_type
== 1) {
1325 int16_t *low
, *high
, *dst
;
1326 int output_stride
, lowpass_height
, lowpass_width
;
1327 ptrdiff_t dst_linesize
;
1329 for (plane
= 0; plane
< s
->planes
; plane
++) {
1330 int act_plane
= plane
== 1 ? 2 : plane
== 2 ? 1 : plane
;
1332 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
1334 dst_linesize
= pic
->linesize
[act_plane
];
1336 dst_linesize
= pic
->linesize
[act_plane
] / 2;
1339 lowpass_height
= s
->plane
[plane
].band
[4][1].height
;
1340 output_stride
= s
->plane
[plane
].band
[4][1].a_width
;
1341 lowpass_width
= s
->plane
[plane
].band
[4][1].width
;
1343 if (lowpass_height
> s
->plane
[plane
].band
[4][1].a_height
|| lowpass_width
> s
->plane
[plane
].band
[4][1].a_width
||
1344 s
->plane
[plane
].band
[4][1].width
> s
->plane
[plane
].band
[4][1].a_width
||
1345 lowpass_width
< 3 || lowpass_height
< 3) {
1346 av_log(avctx
, AV_LOG_ERROR
, "Invalid plane dimensions\n");
1347 ret
= AVERROR(EINVAL
);
1351 if (s
->progressive
) {
1352 dst
= (int16_t *)pic
->data
[act_plane
];
1353 low
= s
->plane
[plane
].l_h
[8];
1354 high
= s
->plane
[plane
].l_h
[9];
1356 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
) {
1360 dst
+= pic
->linesize
[act_plane
] >> 1;
1363 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
&&
1364 (lowpass_height
* 2 > avctx
->coded_height
/ 2 ||
1365 lowpass_width
* 2 > avctx
->coded_width
/ 2 )
1367 ret
= AVERROR_INVALIDDATA
;
1371 for (i
= 0; i
< s
->plane
[act_plane
].height
; i
++) {
1372 dsp
->horiz_filter_clip(dst
, low
, high
, lowpass_width
, s
->bpc
);
1373 low
+= output_stride
;
1374 high
+= output_stride
;
1375 dst
+= dst_linesize
;
1378 dst
= (int16_t *)pic
->data
[act_plane
];
1379 low
= s
->plane
[plane
].l_h
[8];
1380 high
= s
->plane
[plane
].l_h
[9];
1381 for (i
= 0; i
< s
->plane
[act_plane
].height
/ 2; i
++) {
1382 interlaced_vertical_filter(dst
, low
, high
, lowpass_width
* 2, pic
->linesize
[act_plane
]/2, act_plane
);
1383 low
+= output_stride
* 2;
1384 high
+= output_stride
* 2;
1385 dst
+= pic
->linesize
[act_plane
];
1391 if (avctx
->pix_fmt
== AV_PIX_FMT_BAYER_RGGB16
)
1392 process_bayer(pic
, s
->bpc
);
1401 static av_cold
int cfhd_close(AVCodecContext
*avctx
)
1403 CFHDContext
*s
= avctx
->priv_data
;
1411 static int update_thread_context(AVCodecContext
*dst
, const AVCodecContext
*src
)
1413 CFHDContext
*psrc
= src
->priv_data
;
1414 CFHDContext
*pdst
= dst
->priv_data
;
1417 if (dst
== src
|| psrc
->transform_type
== 0)
1420 if (pdst
->plane
[0].idwt_size
!= psrc
->plane
[0].idwt_size
||
1421 pdst
->a_format
!= psrc
->a_format
||
1422 pdst
->a_width
!= psrc
->a_width
||
1423 pdst
->a_height
!= psrc
->a_height
||
1424 pdst
->a_transform_type
!= psrc
->a_transform_type
)
1427 pdst
->a_format
= psrc
->a_format
;
1428 pdst
->a_width
= psrc
->a_width
;
1429 pdst
->a_height
= psrc
->a_height
;
1430 pdst
->a_transform_type
= psrc
->a_transform_type
;
1431 pdst
->transform_type
= psrc
->transform_type
;
1432 pdst
->progressive
= psrc
->progressive
;
1433 pdst
->planes
= psrc
->planes
;
1435 if (!pdst
->plane
[0].idwt_buf
) {
1436 pdst
->coded_width
= pdst
->a_width
;
1437 pdst
->coded_height
= pdst
->a_height
;
1438 pdst
->coded_format
= pdst
->a_format
;
1439 pdst
->transform_type
= pdst
->a_transform_type
;
1440 ret
= alloc_buffers(dst
);
1445 for (int plane
= 0; plane
< pdst
->planes
; plane
++) {
1446 memcpy(pdst
->plane
[plane
].band
, psrc
->plane
[plane
].band
, sizeof(pdst
->plane
[plane
].band
));
1447 memcpy(pdst
->plane
[plane
].idwt_buf
, psrc
->plane
[plane
].idwt_buf
,
1448 pdst
->plane
[plane
].idwt_size
* sizeof(int16_t));
1455 const FFCodec ff_cfhd_decoder
= {
1457 CODEC_LONG_NAME("GoPro CineForm HD"),
1458 .p
.type
= AVMEDIA_TYPE_VIDEO
,
1459 .p
.id
= AV_CODEC_ID_CFHD
,
1460 .priv_data_size
= sizeof(CFHDContext
),
1462 .close
= cfhd_close
,
1463 FF_CODEC_DECODE_CB(cfhd_decode
),
1464 UPDATE_THREAD_CONTEXT(update_thread_context
),
1465 .p
.capabilities
= AV_CODEC_CAP_DR1
| AV_CODEC_CAP_FRAME_THREADS
,
1466 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,