]> git.sesse.net Git - ffmpeg/blob - libavcodec/proresdec2.c
avcodec/proresdec : rename dsp part for 10b and check dspinit for supported bits...
[ffmpeg] / libavcodec / proresdec2.c
1 /*
2  * Copyright (c) 2010-2011 Maxim Poliakovski
3  * Copyright (c) 2010-2011 Elvis Presley
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg 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.
11  *
12  * FFmpeg 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.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * Known FOURCCs: 'apch' (HQ), 'apcn' (SD), 'apcs' (LT), 'acpo' (Proxy), 'ap4h' (4444)
25  */
26
27 //#define DEBUG
28
29 #define LONG_BITSTREAM_READER
30
31 #include "libavutil/internal.h"
32 #include "avcodec.h"
33 #include "get_bits.h"
34 #include "idctdsp.h"
35 #include "internal.h"
36 #include "profiles.h"
37 #include "simple_idct.h"
38 #include "proresdec.h"
39 #include "proresdata.h"
40 #include "thread.h"
41
42 static void permute(uint8_t *dst, const uint8_t *src, const uint8_t permutation[64])
43 {
44     int i;
45     for (i = 0; i < 64; i++)
46         dst[i] = permutation[src[i]];
47 }
48
49 static av_cold int decode_init(AVCodecContext *avctx)
50 {
51     int ret = 0;
52     ProresContext *ctx = avctx->priv_data;
53     uint8_t idct_permutation[64];
54
55     avctx->bits_per_raw_sample = 10;
56
57     switch (avctx->codec_tag) {
58     case MKTAG('a','p','c','o'):
59         avctx->profile = FF_PROFILE_PRORES_PROXY;
60         break;
61     case MKTAG('a','p','c','s'):
62         avctx->profile = FF_PROFILE_PRORES_LT;
63         break;
64     case MKTAG('a','p','c','n'):
65         avctx->profile = FF_PROFILE_PRORES_STANDARD;
66         break;
67     case MKTAG('a','p','c','h'):
68         avctx->profile = FF_PROFILE_PRORES_HQ;
69         break;
70     case MKTAG('a','p','4','h'):
71         avctx->profile = FF_PROFILE_PRORES_4444;
72         break;
73     case MKTAG('a','p','4','x'):
74         avctx->profile = FF_PROFILE_PRORES_XQ;
75         break;
76     default:
77         avctx->profile = FF_PROFILE_UNKNOWN;
78         av_log(avctx, AV_LOG_WARNING, "Unknown prores profile %d\n", avctx->codec_tag);
79     }
80
81     ff_blockdsp_init(&ctx->bdsp, avctx);
82     ret = ff_proresdsp_init(&ctx->prodsp, avctx);
83     if (ret < 0) {
84         av_log(avctx, AV_LOG_ERROR, "Fail to init proresdsp for bits per raw sample %d\n", avctx->bits_per_raw_sample);
85         return ret;
86     }
87
88     ff_init_scantable_permutation(idct_permutation,
89                                   ctx->prodsp.idct_permutation_type);
90
91     permute(ctx->progressive_scan, ff_prores_progressive_scan, idct_permutation);
92     permute(ctx->interlaced_scan, ff_prores_interlaced_scan, idct_permutation);
93
94     return ret;
95 }
96
97 static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
98                                const int data_size, AVCodecContext *avctx)
99 {
100     int hdr_size, width, height, flags;
101     int version;
102     const uint8_t *ptr;
103
104     hdr_size = AV_RB16(buf);
105     ff_dlog(avctx, "header size %d\n", hdr_size);
106     if (hdr_size > data_size) {
107         av_log(avctx, AV_LOG_ERROR, "error, wrong header size\n");
108         return AVERROR_INVALIDDATA;
109     }
110
111     version = AV_RB16(buf + 2);
112     ff_dlog(avctx, "%.4s version %d\n", buf+4, version);
113     if (version > 1) {
114         av_log(avctx, AV_LOG_ERROR, "unsupported version: %d\n", version);
115         return AVERROR_PATCHWELCOME;
116     }
117
118     width  = AV_RB16(buf + 8);
119     height = AV_RB16(buf + 10);
120     if (width != avctx->width || height != avctx->height) {
121         av_log(avctx, AV_LOG_ERROR, "picture resolution change: %dx%d -> %dx%d\n",
122                avctx->width, avctx->height, width, height);
123         return AVERROR_PATCHWELCOME;
124     }
125
126     ctx->frame_type = (buf[12] >> 2) & 3;
127     ctx->alpha_info = buf[17] & 0xf;
128
129     if (ctx->alpha_info > 2) {
130         av_log(avctx, AV_LOG_ERROR, "Invalid alpha mode %d\n", ctx->alpha_info);
131         return AVERROR_INVALIDDATA;
132     }
133     if (avctx->skip_alpha) ctx->alpha_info = 0;
134
135     ff_dlog(avctx, "frame type %d\n", ctx->frame_type);
136
137     if (ctx->frame_type == 0) {
138         ctx->scan = ctx->progressive_scan; // permuted
139     } else {
140         ctx->scan = ctx->interlaced_scan; // permuted
141         ctx->frame->interlaced_frame = 1;
142         ctx->frame->top_field_first = ctx->frame_type == 1;
143     }
144
145     if (ctx->alpha_info) {
146         avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUVA444P10 : AV_PIX_FMT_YUVA422P10;
147     } else {
148         avctx->pix_fmt = (buf[12] & 0xC0) == 0xC0 ? AV_PIX_FMT_YUV444P10 : AV_PIX_FMT_YUV422P10;
149     }
150
151     avctx->color_primaries = buf[14];
152     avctx->color_trc       = buf[15];
153     avctx->colorspace      = buf[16];
154     avctx->color_range     = AVCOL_RANGE_MPEG;
155
156     ptr   = buf + 20;
157     flags = buf[19];
158     ff_dlog(avctx, "flags %x\n", flags);
159
160     if (flags & 2) {
161         if(buf + data_size - ptr < 64) {
162             av_log(avctx, AV_LOG_ERROR, "Header truncated\n");
163             return AVERROR_INVALIDDATA;
164         }
165         permute(ctx->qmat_luma, ctx->prodsp.idct_permutation, ptr);
166         ptr += 64;
167     } else {
168         memset(ctx->qmat_luma, 4, 64);
169     }
170
171     if (flags & 1) {
172         if(buf + data_size - ptr < 64) {
173             av_log(avctx, AV_LOG_ERROR, "Header truncated\n");
174             return AVERROR_INVALIDDATA;
175         }
176         permute(ctx->qmat_chroma, ctx->prodsp.idct_permutation, ptr);
177     } else {
178         memset(ctx->qmat_chroma, 4, 64);
179     }
180
181     return hdr_size;
182 }
183
184 static int decode_picture_header(AVCodecContext *avctx, const uint8_t *buf, const int buf_size)
185 {
186     ProresContext *ctx = avctx->priv_data;
187     int i, hdr_size, slice_count;
188     unsigned pic_data_size;
189     int log2_slice_mb_width, log2_slice_mb_height;
190     int slice_mb_count, mb_x, mb_y;
191     const uint8_t *data_ptr, *index_ptr;
192
193     hdr_size = buf[0] >> 3;
194     if (hdr_size < 8 || hdr_size > buf_size) {
195         av_log(avctx, AV_LOG_ERROR, "error, wrong picture header size\n");
196         return AVERROR_INVALIDDATA;
197     }
198
199     pic_data_size = AV_RB32(buf + 1);
200     if (pic_data_size > buf_size) {
201         av_log(avctx, AV_LOG_ERROR, "error, wrong picture data size\n");
202         return AVERROR_INVALIDDATA;
203     }
204
205     log2_slice_mb_width  = buf[7] >> 4;
206     log2_slice_mb_height = buf[7] & 0xF;
207     if (log2_slice_mb_width > 3 || log2_slice_mb_height) {
208         av_log(avctx, AV_LOG_ERROR, "unsupported slice resolution: %dx%d\n",
209                1 << log2_slice_mb_width, 1 << log2_slice_mb_height);
210         return AVERROR_INVALIDDATA;
211     }
212
213     ctx->mb_width  = (avctx->width  + 15) >> 4;
214     if (ctx->frame_type)
215         ctx->mb_height = (avctx->height + 31) >> 5;
216     else
217         ctx->mb_height = (avctx->height + 15) >> 4;
218
219     // QT ignores the written value
220     // slice_count = AV_RB16(buf + 5);
221     slice_count = ctx->mb_height * ((ctx->mb_width >> log2_slice_mb_width) +
222                                     av_popcount(ctx->mb_width & (1 << log2_slice_mb_width) - 1));
223
224     if (ctx->slice_count != slice_count || !ctx->slices) {
225         av_freep(&ctx->slices);
226         ctx->slice_count = 0;
227         ctx->slices = av_mallocz_array(slice_count, sizeof(*ctx->slices));
228         if (!ctx->slices)
229             return AVERROR(ENOMEM);
230         ctx->slice_count = slice_count;
231     }
232
233     if (!slice_count)
234         return AVERROR(EINVAL);
235
236     if (hdr_size + slice_count*2 > buf_size) {
237         av_log(avctx, AV_LOG_ERROR, "error, wrong slice count\n");
238         return AVERROR_INVALIDDATA;
239     }
240
241     // parse slice information
242     index_ptr = buf + hdr_size;
243     data_ptr  = index_ptr + slice_count*2;
244
245     slice_mb_count = 1 << log2_slice_mb_width;
246     mb_x = 0;
247     mb_y = 0;
248
249     for (i = 0; i < slice_count; i++) {
250         SliceContext *slice = &ctx->slices[i];
251
252         slice->data = data_ptr;
253         data_ptr += AV_RB16(index_ptr + i*2);
254
255         while (ctx->mb_width - mb_x < slice_mb_count)
256             slice_mb_count >>= 1;
257
258         slice->mb_x = mb_x;
259         slice->mb_y = mb_y;
260         slice->mb_count = slice_mb_count;
261         slice->data_size = data_ptr - slice->data;
262
263         if (slice->data_size < 6) {
264             av_log(avctx, AV_LOG_ERROR, "error, wrong slice data size\n");
265             return AVERROR_INVALIDDATA;
266         }
267
268         mb_x += slice_mb_count;
269         if (mb_x == ctx->mb_width) {
270             slice_mb_count = 1 << log2_slice_mb_width;
271             mb_x = 0;
272             mb_y++;
273         }
274         if (data_ptr > buf + buf_size) {
275             av_log(avctx, AV_LOG_ERROR, "error, slice out of bounds\n");
276             return AVERROR_INVALIDDATA;
277         }
278     }
279
280     if (mb_x || mb_y != ctx->mb_height) {
281         av_log(avctx, AV_LOG_ERROR, "error wrong mb count y %d h %d\n",
282                mb_y, ctx->mb_height);
283         return AVERROR_INVALIDDATA;
284     }
285
286     return pic_data_size;
287 }
288
289 #define DECODE_CODEWORD(val, codebook, SKIP)                            \
290     do {                                                                \
291         unsigned int rice_order, exp_order, switch_bits;                \
292         unsigned int q, buf, bits;                                      \
293                                                                         \
294         UPDATE_CACHE(re, gb);                                           \
295         buf = GET_CACHE(re, gb);                                        \
296                                                                         \
297         /* number of bits to switch between rice and exp golomb */      \
298         switch_bits =  codebook & 3;                                    \
299         rice_order  =  codebook >> 5;                                   \
300         exp_order   = (codebook >> 2) & 7;                              \
301                                                                         \
302         q = 31 - av_log2(buf);                                          \
303                                                                         \
304         if (q > switch_bits) { /* exp golomb */                         \
305             bits = exp_order - switch_bits + (q<<1);                    \
306             if (bits > FFMIN(MIN_CACHE_BITS, 31))                       \
307                 return AVERROR_INVALIDDATA;                             \
308             val = SHOW_UBITS(re, gb, bits) - (1 << exp_order) +         \
309                 ((switch_bits + 1) << rice_order);                      \
310             SKIP(re, gb, bits);                                         \
311         } else if (rice_order) {                                        \
312             SKIP_BITS(re, gb, q+1);                                     \
313             val = (q << rice_order) + SHOW_UBITS(re, gb, rice_order);   \
314             SKIP(re, gb, rice_order);                                   \
315         } else {                                                        \
316             val = q;                                                    \
317             SKIP(re, gb, q+1);                                          \
318         }                                                               \
319     } while (0)
320
321 #define TOSIGNED(x) (((x) >> 1) ^ (-((x) & 1)))
322
323 #define FIRST_DC_CB 0xB8
324
325 static const uint8_t dc_codebook[7] = { 0x04, 0x28, 0x28, 0x4D, 0x4D, 0x70, 0x70};
326
327 static av_always_inline int decode_dc_coeffs(GetBitContext *gb, int16_t *out,
328                                               int blocks_per_slice)
329 {
330     int16_t prev_dc;
331     int code, i, sign;
332
333     OPEN_READER(re, gb);
334
335     DECODE_CODEWORD(code, FIRST_DC_CB, LAST_SKIP_BITS);
336     prev_dc = TOSIGNED(code);
337     out[0] = prev_dc;
338
339     out += 64; // dc coeff for the next block
340
341     code = 5;
342     sign = 0;
343     for (i = 1; i < blocks_per_slice; i++, out += 64) {
344         DECODE_CODEWORD(code, dc_codebook[FFMIN(code, 6U)], LAST_SKIP_BITS);
345         if(code) sign ^= -(code & 1);
346         else     sign  = 0;
347         prev_dc += (((code + 1) >> 1) ^ sign) - sign;
348         out[0] = prev_dc;
349     }
350     CLOSE_READER(re, gb);
351     return 0;
352 }
353
354 // adaptive codebook switching lut according to previous run/level values
355 static const uint8_t run_to_cb[16] = { 0x06, 0x06, 0x05, 0x05, 0x04, 0x29, 0x29, 0x29, 0x29, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4C };
356 static const uint8_t lev_to_cb[10] = { 0x04, 0x0A, 0x05, 0x06, 0x04, 0x28, 0x28, 0x28, 0x28, 0x4C };
357
358 static av_always_inline int decode_ac_coeffs(AVCodecContext *avctx, GetBitContext *gb,
359                                              int16_t *out, int blocks_per_slice)
360 {
361     ProresContext *ctx = avctx->priv_data;
362     int block_mask, sign;
363     unsigned pos, run, level;
364     int max_coeffs, i, bits_left;
365     int log2_block_count = av_log2(blocks_per_slice);
366
367     OPEN_READER(re, gb);
368     UPDATE_CACHE(re, gb);                                           \
369     run   = 4;
370     level = 2;
371
372     max_coeffs = 64 << log2_block_count;
373     block_mask = blocks_per_slice - 1;
374
375     for (pos = block_mask;;) {
376         bits_left = gb->size_in_bits - re_index;
377         if (!bits_left || (bits_left < 32 && !SHOW_UBITS(re, gb, bits_left)))
378             break;
379
380         DECODE_CODEWORD(run, run_to_cb[FFMIN(run,  15)], LAST_SKIP_BITS);
381         pos += run + 1;
382         if (pos >= max_coeffs) {
383             av_log(avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", pos, max_coeffs);
384             return AVERROR_INVALIDDATA;
385         }
386
387         DECODE_CODEWORD(level, lev_to_cb[FFMIN(level, 9)], SKIP_BITS);
388         level += 1;
389
390         i = pos >> log2_block_count;
391
392         sign = SHOW_SBITS(re, gb, 1);
393         SKIP_BITS(re, gb, 1);
394         out[((pos & block_mask) << 6) + ctx->scan[i]] = ((level ^ sign) - sign);
395     }
396
397     CLOSE_READER(re, gb);
398     return 0;
399 }
400
401 static int decode_slice_luma(AVCodecContext *avctx, SliceContext *slice,
402                              uint16_t *dst, int dst_stride,
403                              const uint8_t *buf, unsigned buf_size,
404                              const int16_t *qmat)
405 {
406     ProresContext *ctx = avctx->priv_data;
407     LOCAL_ALIGNED_32(int16_t, blocks, [8*4*64]);
408     int16_t *block;
409     GetBitContext gb;
410     int i, blocks_per_slice = slice->mb_count<<2;
411     int ret;
412
413     for (i = 0; i < blocks_per_slice; i++)
414         ctx->bdsp.clear_block(blocks+(i<<6));
415
416     init_get_bits(&gb, buf, buf_size << 3);
417
418     if ((ret = decode_dc_coeffs(&gb, blocks, blocks_per_slice)) < 0)
419         return ret;
420     if ((ret = decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice)) < 0)
421         return ret;
422
423     block = blocks;
424     for (i = 0; i < slice->mb_count; i++) {
425         ctx->prodsp.idct_put(dst, dst_stride, block+(0<<6), qmat);
426         ctx->prodsp.idct_put(dst             +8, dst_stride, block+(1<<6), qmat);
427         ctx->prodsp.idct_put(dst+4*dst_stride  , dst_stride, block+(2<<6), qmat);
428         ctx->prodsp.idct_put(dst+4*dst_stride+8, dst_stride, block+(3<<6), qmat);
429         block += 4*64;
430         dst += 16;
431     }
432     return 0;
433 }
434
435 static int decode_slice_chroma(AVCodecContext *avctx, SliceContext *slice,
436                                uint16_t *dst, int dst_stride,
437                                const uint8_t *buf, unsigned buf_size,
438                                const int16_t *qmat, int log2_blocks_per_mb)
439 {
440     ProresContext *ctx = avctx->priv_data;
441     LOCAL_ALIGNED_32(int16_t, blocks, [8*4*64]);
442     int16_t *block;
443     GetBitContext gb;
444     int i, j, blocks_per_slice = slice->mb_count << log2_blocks_per_mb;
445     int ret;
446
447     for (i = 0; i < blocks_per_slice; i++)
448         ctx->bdsp.clear_block(blocks+(i<<6));
449
450     init_get_bits(&gb, buf, buf_size << 3);
451
452     if ((ret = decode_dc_coeffs(&gb, blocks, blocks_per_slice)) < 0)
453         return ret;
454     if ((ret = decode_ac_coeffs(avctx, &gb, blocks, blocks_per_slice)) < 0)
455         return ret;
456
457     block = blocks;
458     for (i = 0; i < slice->mb_count; i++) {
459         for (j = 0; j < log2_blocks_per_mb; j++) {
460             ctx->prodsp.idct_put(dst,              dst_stride, block+(0<<6), qmat);
461             ctx->prodsp.idct_put(dst+4*dst_stride, dst_stride, block+(1<<6), qmat);
462             block += 2*64;
463             dst += 8;
464         }
465     }
466     return 0;
467 }
468
469 static void unpack_alpha(GetBitContext *gb, uint16_t *dst, int num_coeffs,
470                          const int num_bits)
471 {
472     const int mask = (1 << num_bits) - 1;
473     int i, idx, val, alpha_val;
474
475     idx       = 0;
476     alpha_val = mask;
477     do {
478         do {
479             if (get_bits1(gb)) {
480                 val = get_bits(gb, num_bits);
481             } else {
482                 int sign;
483                 val  = get_bits(gb, num_bits == 16 ? 7 : 4);
484                 sign = val & 1;
485                 val  = (val + 2) >> 1;
486                 if (sign)
487                     val = -val;
488             }
489             alpha_val = (alpha_val + val) & mask;
490             if (num_bits == 16) {
491                 dst[idx++] = alpha_val >> 6;
492             } else {
493                 dst[idx++] = (alpha_val << 2) | (alpha_val >> 6);
494             }
495             if (idx >= num_coeffs)
496                 break;
497         } while (get_bits_left(gb)>0 && get_bits1(gb));
498         val = get_bits(gb, 4);
499         if (!val)
500             val = get_bits(gb, 11);
501         if (idx + val > num_coeffs)
502             val = num_coeffs - idx;
503         if (num_bits == 16) {
504             for (i = 0; i < val; i++)
505                 dst[idx++] = alpha_val >> 6;
506         } else {
507             for (i = 0; i < val; i++)
508                 dst[idx++] = (alpha_val << 2) | (alpha_val >> 6);
509
510         }
511     } while (idx < num_coeffs);
512 }
513
514 /**
515  * Decode alpha slice plane.
516  */
517 static void decode_slice_alpha(ProresContext *ctx,
518                                uint16_t *dst, int dst_stride,
519                                const uint8_t *buf, int buf_size,
520                                int blocks_per_slice)
521 {
522     GetBitContext gb;
523     int i;
524     LOCAL_ALIGNED_32(int16_t, blocks, [8*4*64]);
525     int16_t *block;
526
527     for (i = 0; i < blocks_per_slice<<2; i++)
528         ctx->bdsp.clear_block(blocks+(i<<6));
529
530     init_get_bits(&gb, buf, buf_size << 3);
531
532     if (ctx->alpha_info == 2) {
533         unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 16);
534     } else {
535         unpack_alpha(&gb, blocks, blocks_per_slice * 4 * 64, 8);
536     }
537
538     block = blocks;
539     for (i = 0; i < 16; i++) {
540         memcpy(dst, block, 16 * blocks_per_slice * sizeof(*dst));
541         dst   += dst_stride >> 1;
542         block += 16 * blocks_per_slice;
543     }
544 }
545
546 static int decode_slice_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
547 {
548     ProresContext *ctx = avctx->priv_data;
549     SliceContext *slice = &ctx->slices[jobnr];
550     const uint8_t *buf = slice->data;
551     AVFrame *pic = ctx->frame;
552     int i, hdr_size, qscale, log2_chroma_blocks_per_mb;
553     int luma_stride, chroma_stride;
554     int y_data_size, u_data_size, v_data_size, a_data_size;
555     uint8_t *dest_y, *dest_u, *dest_v, *dest_a;
556     LOCAL_ALIGNED_16(int16_t, qmat_luma_scaled,  [64]);
557     LOCAL_ALIGNED_16(int16_t, qmat_chroma_scaled,[64]);
558     int mb_x_shift;
559     int ret;
560
561     slice->ret = -1;
562     //av_log(avctx, AV_LOG_INFO, "slice %d mb width %d mb x %d y %d\n",
563     //       jobnr, slice->mb_count, slice->mb_x, slice->mb_y);
564
565     // slice header
566     hdr_size = buf[0] >> 3;
567     qscale = av_clip(buf[1], 1, 224);
568     qscale = qscale > 128 ? qscale - 96 << 2: qscale;
569     y_data_size = AV_RB16(buf + 2);
570     u_data_size = AV_RB16(buf + 4);
571     v_data_size = slice->data_size - y_data_size - u_data_size - hdr_size;
572     if (hdr_size > 7) v_data_size = AV_RB16(buf + 6);
573     a_data_size = slice->data_size - y_data_size - u_data_size -
574                   v_data_size - hdr_size;
575
576     if (y_data_size < 0 || u_data_size < 0 || v_data_size < 0
577         || hdr_size+y_data_size+u_data_size+v_data_size > slice->data_size){
578         av_log(avctx, AV_LOG_ERROR, "invalid plane data size\n");
579         return AVERROR_INVALIDDATA;
580     }
581
582     buf += hdr_size;
583
584     for (i = 0; i < 64; i++) {
585         qmat_luma_scaled  [i] = ctx->qmat_luma  [i] * qscale;
586         qmat_chroma_scaled[i] = ctx->qmat_chroma[i] * qscale;
587     }
588
589     if (ctx->frame_type == 0) {
590         luma_stride   = pic->linesize[0];
591         chroma_stride = pic->linesize[1];
592     } else {
593         luma_stride   = pic->linesize[0] << 1;
594         chroma_stride = pic->linesize[1] << 1;
595     }
596
597     if (avctx->pix_fmt == AV_PIX_FMT_YUV444P10 || avctx->pix_fmt == AV_PIX_FMT_YUVA444P10) {
598         mb_x_shift = 5;
599         log2_chroma_blocks_per_mb = 2;
600     } else {
601         mb_x_shift = 4;
602         log2_chroma_blocks_per_mb = 1;
603     }
604
605     dest_y = pic->data[0] + (slice->mb_y << 4) * luma_stride + (slice->mb_x << 5);
606     dest_u = pic->data[1] + (slice->mb_y << 4) * chroma_stride + (slice->mb_x << mb_x_shift);
607     dest_v = pic->data[2] + (slice->mb_y << 4) * chroma_stride + (slice->mb_x << mb_x_shift);
608     dest_a = pic->data[3] + (slice->mb_y << 4) * luma_stride + (slice->mb_x << 5);
609
610     if (ctx->frame_type && ctx->first_field ^ ctx->frame->top_field_first) {
611         dest_y += pic->linesize[0];
612         dest_u += pic->linesize[1];
613         dest_v += pic->linesize[2];
614         dest_a += pic->linesize[3];
615     }
616
617     ret = decode_slice_luma(avctx, slice, (uint16_t*)dest_y, luma_stride,
618                             buf, y_data_size, qmat_luma_scaled);
619     if (ret < 0)
620         return ret;
621
622     if (!(avctx->flags & AV_CODEC_FLAG_GRAY) && (u_data_size + v_data_size) > 0) {
623         ret = decode_slice_chroma(avctx, slice, (uint16_t*)dest_u, chroma_stride,
624                                   buf + y_data_size, u_data_size,
625                                   qmat_chroma_scaled, log2_chroma_blocks_per_mb);
626         if (ret < 0)
627             return ret;
628
629         ret = decode_slice_chroma(avctx, slice, (uint16_t*)dest_v, chroma_stride,
630                                   buf + y_data_size + u_data_size, v_data_size,
631                                   qmat_chroma_scaled, log2_chroma_blocks_per_mb);
632         if (ret < 0)
633             return ret;
634     }
635     else {
636         size_t mb_max_x = slice->mb_count << (mb_x_shift - 1);
637         size_t i, j;
638         for (i = 0; i < 16; ++i)
639             for (j = 0; j < mb_max_x; ++j) {
640                 *(uint16_t*)(dest_u + (i * chroma_stride) + (j << 1)) = 511;
641                 *(uint16_t*)(dest_v + (i * chroma_stride) + (j << 1)) = 511;
642             }
643     }
644
645     /* decode alpha plane if available */
646     if (ctx->alpha_info && pic->data[3] && a_data_size)
647         decode_slice_alpha(ctx, (uint16_t*)dest_a, luma_stride,
648                            buf + y_data_size + u_data_size + v_data_size,
649                            a_data_size, slice->mb_count);
650
651     slice->ret = 0;
652     return 0;
653 }
654
655 static int decode_picture(AVCodecContext *avctx)
656 {
657     ProresContext *ctx = avctx->priv_data;
658     int i;
659     int error = 0;
660
661     avctx->execute2(avctx, decode_slice_thread, NULL, NULL, ctx->slice_count);
662
663     for (i = 0; i < ctx->slice_count; i++)
664         error += ctx->slices[i].ret < 0;
665
666     if (error)
667         ctx->frame->decode_error_flags = FF_DECODE_ERROR_INVALID_BITSTREAM;
668     if (error < ctx->slice_count)
669         return 0;
670
671     return ctx->slices[0].ret;
672 }
673
674 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
675                         AVPacket *avpkt)
676 {
677     ProresContext *ctx = avctx->priv_data;
678     ThreadFrame tframe = { .f = data };
679     AVFrame *frame = data;
680     const uint8_t *buf = avpkt->data;
681     int buf_size = avpkt->size;
682     int frame_hdr_size, pic_size, ret;
683
684     if (buf_size < 28 || AV_RL32(buf + 4) != AV_RL32("icpf")) {
685         av_log(avctx, AV_LOG_ERROR, "invalid frame header\n");
686         return AVERROR_INVALIDDATA;
687     }
688
689     ctx->frame = frame;
690     ctx->frame->pict_type = AV_PICTURE_TYPE_I;
691     ctx->frame->key_frame = 1;
692     ctx->first_field = 1;
693
694     buf += 8;
695     buf_size -= 8;
696
697     frame_hdr_size = decode_frame_header(ctx, buf, buf_size, avctx);
698     if (frame_hdr_size < 0)
699         return frame_hdr_size;
700
701     buf += frame_hdr_size;
702     buf_size -= frame_hdr_size;
703
704     if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
705         return ret;
706
707  decode_picture:
708     pic_size = decode_picture_header(avctx, buf, buf_size);
709     if (pic_size < 0) {
710         av_log(avctx, AV_LOG_ERROR, "error decoding picture header\n");
711         return pic_size;
712     }
713
714     if ((ret = decode_picture(avctx)) < 0) {
715         av_log(avctx, AV_LOG_ERROR, "error decoding picture\n");
716         return ret;
717     }
718
719     buf += pic_size;
720     buf_size -= pic_size;
721
722     if (ctx->frame_type && buf_size > 0 && ctx->first_field) {
723         ctx->first_field = 0;
724         goto decode_picture;
725     }
726
727     *got_frame      = 1;
728
729     return avpkt->size;
730 }
731
732 #if HAVE_THREADS
733 static int decode_init_thread_copy(AVCodecContext *avctx)
734 {
735     ProresContext *ctx = avctx->priv_data;
736
737     ctx->slices = NULL;
738
739     return 0;
740 }
741 #endif
742
743 static av_cold int decode_close(AVCodecContext *avctx)
744 {
745     ProresContext *ctx = avctx->priv_data;
746
747     av_freep(&ctx->slices);
748
749     return 0;
750 }
751
752 AVCodec ff_prores_decoder = {
753     .name           = "prores",
754     .long_name      = NULL_IF_CONFIG_SMALL("ProRes (iCodec Pro)"),
755     .type           = AVMEDIA_TYPE_VIDEO,
756     .id             = AV_CODEC_ID_PRORES,
757     .priv_data_size = sizeof(ProresContext),
758     .init           = decode_init,
759     .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
760     .close          = decode_close,
761     .decode         = decode_frame,
762     .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
763     .profiles       = NULL_IF_CONFIG_SMALL(ff_prores_profiles),
764 };