1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#undef FUNC
23cabdff1aSopenharmony_ci#undef PIXEL_SHIFT
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#if SIMPLE
26cabdff1aSopenharmony_ci#   define FUNC(n) AV_JOIN(n ## _simple_, BITS)
27cabdff1aSopenharmony_ci#   define PIXEL_SHIFT (BITS >> 4)
28cabdff1aSopenharmony_ci#else
29cabdff1aSopenharmony_ci#   define FUNC(n) n ## _complex
30cabdff1aSopenharmony_ci#   define PIXEL_SHIFT h->pixel_shift
31cabdff1aSopenharmony_ci#endif
32cabdff1aSopenharmony_ci
33cabdff1aSopenharmony_ci#undef  CHROMA_IDC
34cabdff1aSopenharmony_ci#define CHROMA_IDC 1
35cabdff1aSopenharmony_ci#include "h264_mc_template.c"
36cabdff1aSopenharmony_ci
37cabdff1aSopenharmony_ci#undef  CHROMA_IDC
38cabdff1aSopenharmony_ci#define CHROMA_IDC 2
39cabdff1aSopenharmony_ci#include "h264_mc_template.c"
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_cistatic av_noinline void FUNC(hl_decode_mb)(const H264Context *h, H264SliceContext *sl)
42cabdff1aSopenharmony_ci{
43cabdff1aSopenharmony_ci    const int mb_x    = sl->mb_x;
44cabdff1aSopenharmony_ci    const int mb_y    = sl->mb_y;
45cabdff1aSopenharmony_ci    const int mb_xy   = sl->mb_xy;
46cabdff1aSopenharmony_ci    const int mb_type = h->cur_pic.mb_type[mb_xy];
47cabdff1aSopenharmony_ci    uint8_t *dest_y, *dest_cb, *dest_cr;
48cabdff1aSopenharmony_ci    int linesize, uvlinesize /*dct_offset*/;
49cabdff1aSopenharmony_ci    int i, j;
50cabdff1aSopenharmony_ci    const int *block_offset = &h->block_offset[0];
51cabdff1aSopenharmony_ci    const int transform_bypass = !SIMPLE && (sl->qscale == 0 && h->ps.sps->transform_bypass);
52cabdff1aSopenharmony_ci    void (*idct_add)(uint8_t *dst, int16_t *block, int stride);
53cabdff1aSopenharmony_ci    const int block_h   = 16 >> h->chroma_y_shift;
54cabdff1aSopenharmony_ci    const int chroma422 = CHROMA422(h);
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci    dest_y  = h->cur_pic.f->data[0] + ((mb_x << PIXEL_SHIFT)     + mb_y * sl->linesize)  * 16;
57cabdff1aSopenharmony_ci    dest_cb = h->cur_pic.f->data[1] +  (mb_x << PIXEL_SHIFT) * 8 + mb_y * sl->uvlinesize * block_h;
58cabdff1aSopenharmony_ci    dest_cr = h->cur_pic.f->data[2] +  (mb_x << PIXEL_SHIFT) * 8 + mb_y * sl->uvlinesize * block_h;
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_ci    h->vdsp.prefetch(dest_y  + (sl->mb_x & 3) * 4 * sl->linesize   + (64 << PIXEL_SHIFT), sl->linesize,       4);
61cabdff1aSopenharmony_ci    h->vdsp.prefetch(dest_cb + (sl->mb_x & 7)     * sl->uvlinesize + (64 << PIXEL_SHIFT), dest_cr - dest_cb, 2);
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci    h->list_counts[mb_xy] = sl->list_count;
64cabdff1aSopenharmony_ci
65cabdff1aSopenharmony_ci    if (!SIMPLE && MB_FIELD(sl)) {
66cabdff1aSopenharmony_ci        linesize     = sl->mb_linesize = sl->linesize * 2;
67cabdff1aSopenharmony_ci        uvlinesize   = sl->mb_uvlinesize = sl->uvlinesize * 2;
68cabdff1aSopenharmony_ci        block_offset = &h->block_offset[48];
69cabdff1aSopenharmony_ci        if (mb_y & 1) { // FIXME move out of this function?
70cabdff1aSopenharmony_ci            dest_y  -= sl->linesize * 15;
71cabdff1aSopenharmony_ci            dest_cb -= sl->uvlinesize * (block_h - 1);
72cabdff1aSopenharmony_ci            dest_cr -= sl->uvlinesize * (block_h - 1);
73cabdff1aSopenharmony_ci        }
74cabdff1aSopenharmony_ci        if (FRAME_MBAFF(h)) {
75cabdff1aSopenharmony_ci            int list;
76cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
77cabdff1aSopenharmony_ci                if (!USES_LIST(mb_type, list))
78cabdff1aSopenharmony_ci                    continue;
79cabdff1aSopenharmony_ci                if (IS_16X16(mb_type)) {
80cabdff1aSopenharmony_ci                    int8_t *ref = &sl->ref_cache[list][scan8[0]];
81cabdff1aSopenharmony_ci                    fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (sl->mb_y & 1), 1);
82cabdff1aSopenharmony_ci                } else {
83cabdff1aSopenharmony_ci                    for (i = 0; i < 16; i += 4) {
84cabdff1aSopenharmony_ci                        int ref = sl->ref_cache[list][scan8[i]];
85cabdff1aSopenharmony_ci                        if (ref >= 0)
86cabdff1aSopenharmony_ci                            fill_rectangle(&sl->ref_cache[list][scan8[i]], 2, 2,
87cabdff1aSopenharmony_ci                                           8, (16 + ref) ^ (sl->mb_y & 1), 1);
88cabdff1aSopenharmony_ci                    }
89cabdff1aSopenharmony_ci                }
90cabdff1aSopenharmony_ci            }
91cabdff1aSopenharmony_ci        }
92cabdff1aSopenharmony_ci    } else {
93cabdff1aSopenharmony_ci        linesize   = sl->mb_linesize   = sl->linesize;
94cabdff1aSopenharmony_ci        uvlinesize = sl->mb_uvlinesize = sl->uvlinesize;
95cabdff1aSopenharmony_ci        // dct_offset = s->linesize * 16;
96cabdff1aSopenharmony_ci    }
97cabdff1aSopenharmony_ci
98cabdff1aSopenharmony_ci    if (!SIMPLE && IS_INTRA_PCM(mb_type)) {
99cabdff1aSopenharmony_ci        const int bit_depth = h->ps.sps->bit_depth_luma;
100cabdff1aSopenharmony_ci        if (PIXEL_SHIFT) {
101cabdff1aSopenharmony_ci            int j;
102cabdff1aSopenharmony_ci            GetBitContext gb;
103cabdff1aSopenharmony_ci            init_get_bits(&gb, sl->intra_pcm_ptr,
104cabdff1aSopenharmony_ci                          ff_h264_mb_sizes[h->ps.sps->chroma_format_idc] * bit_depth);
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci            for (i = 0; i < 16; i++) {
107cabdff1aSopenharmony_ci                uint16_t *tmp_y = (uint16_t *)(dest_y + i * linesize);
108cabdff1aSopenharmony_ci                for (j = 0; j < 16; j++)
109cabdff1aSopenharmony_ci                    tmp_y[j] = get_bits(&gb, bit_depth);
110cabdff1aSopenharmony_ci            }
111cabdff1aSopenharmony_ci            if (SIMPLE || !CONFIG_GRAY || !(h->flags & AV_CODEC_FLAG_GRAY)) {
112cabdff1aSopenharmony_ci                if (!h->ps.sps->chroma_format_idc) {
113cabdff1aSopenharmony_ci                    for (i = 0; i < block_h; i++) {
114cabdff1aSopenharmony_ci                        uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize);
115cabdff1aSopenharmony_ci                        uint16_t *tmp_cr = (uint16_t *)(dest_cr + i * uvlinesize);
116cabdff1aSopenharmony_ci                        for (j = 0; j < 8; j++) {
117cabdff1aSopenharmony_ci                            tmp_cb[j] = tmp_cr[j] = 1 << (bit_depth - 1);
118cabdff1aSopenharmony_ci                        }
119cabdff1aSopenharmony_ci                    }
120cabdff1aSopenharmony_ci                } else {
121cabdff1aSopenharmony_ci                    for (i = 0; i < block_h; i++) {
122cabdff1aSopenharmony_ci                        uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize);
123cabdff1aSopenharmony_ci                        for (j = 0; j < 8; j++)
124cabdff1aSopenharmony_ci                            tmp_cb[j] = get_bits(&gb, bit_depth);
125cabdff1aSopenharmony_ci                    }
126cabdff1aSopenharmony_ci                    for (i = 0; i < block_h; i++) {
127cabdff1aSopenharmony_ci                        uint16_t *tmp_cr = (uint16_t *)(dest_cr + i * uvlinesize);
128cabdff1aSopenharmony_ci                        for (j = 0; j < 8; j++)
129cabdff1aSopenharmony_ci                            tmp_cr[j] = get_bits(&gb, bit_depth);
130cabdff1aSopenharmony_ci                    }
131cabdff1aSopenharmony_ci                }
132cabdff1aSopenharmony_ci            }
133cabdff1aSopenharmony_ci        } else {
134cabdff1aSopenharmony_ci            for (i = 0; i < 16; i++)
135cabdff1aSopenharmony_ci                memcpy(dest_y + i * linesize, sl->intra_pcm_ptr + i * 16, 16);
136cabdff1aSopenharmony_ci            if (SIMPLE || !CONFIG_GRAY || !(h->flags & AV_CODEC_FLAG_GRAY)) {
137cabdff1aSopenharmony_ci                if (!h->ps.sps->chroma_format_idc) {
138cabdff1aSopenharmony_ci                    for (i = 0; i < 8; i++) {
139cabdff1aSopenharmony_ci                        memset(dest_cb + i * uvlinesize, 1 << (bit_depth - 1), 8);
140cabdff1aSopenharmony_ci                        memset(dest_cr + i * uvlinesize, 1 << (bit_depth - 1), 8);
141cabdff1aSopenharmony_ci                    }
142cabdff1aSopenharmony_ci                } else {
143cabdff1aSopenharmony_ci                    const uint8_t *src_cb = sl->intra_pcm_ptr + 256;
144cabdff1aSopenharmony_ci                    const uint8_t *src_cr = sl->intra_pcm_ptr + 256 + block_h * 8;
145cabdff1aSopenharmony_ci                    for (i = 0; i < block_h; i++) {
146cabdff1aSopenharmony_ci                        memcpy(dest_cb + i * uvlinesize, src_cb + i * 8, 8);
147cabdff1aSopenharmony_ci                        memcpy(dest_cr + i * uvlinesize, src_cr + i * 8, 8);
148cabdff1aSopenharmony_ci                    }
149cabdff1aSopenharmony_ci                }
150cabdff1aSopenharmony_ci            }
151cabdff1aSopenharmony_ci        }
152cabdff1aSopenharmony_ci    } else {
153cabdff1aSopenharmony_ci        if (IS_INTRA(mb_type)) {
154cabdff1aSopenharmony_ci            if (sl->deblocking_filter)
155cabdff1aSopenharmony_ci                xchg_mb_border(h, sl, dest_y, dest_cb, dest_cr, linesize,
156cabdff1aSopenharmony_ci                               uvlinesize, 1, 0, SIMPLE, PIXEL_SHIFT);
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_ci            if (SIMPLE || !CONFIG_GRAY || !(h->flags & AV_CODEC_FLAG_GRAY)) {
159cabdff1aSopenharmony_ci                h->hpc.pred8x8[sl->chroma_pred_mode](dest_cb, uvlinesize);
160cabdff1aSopenharmony_ci                h->hpc.pred8x8[sl->chroma_pred_mode](dest_cr, uvlinesize);
161cabdff1aSopenharmony_ci            }
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_ci            hl_decode_mb_predict_luma(h, sl, mb_type, SIMPLE,
164cabdff1aSopenharmony_ci                                      transform_bypass, PIXEL_SHIFT,
165cabdff1aSopenharmony_ci                                      block_offset, linesize, dest_y, 0);
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_ci            if (sl->deblocking_filter)
168cabdff1aSopenharmony_ci                xchg_mb_border(h, sl, dest_y, dest_cb, dest_cr, linesize,
169cabdff1aSopenharmony_ci                               uvlinesize, 0, 0, SIMPLE, PIXEL_SHIFT);
170cabdff1aSopenharmony_ci        } else {
171cabdff1aSopenharmony_ci            if (chroma422) {
172cabdff1aSopenharmony_ci                FUNC(hl_motion_422)(h, sl, dest_y, dest_cb, dest_cr,
173cabdff1aSopenharmony_ci                              h->h264qpel.put_h264_qpel_pixels_tab,
174cabdff1aSopenharmony_ci                              h->h264chroma.put_h264_chroma_pixels_tab,
175cabdff1aSopenharmony_ci                              h->h264qpel.avg_h264_qpel_pixels_tab,
176cabdff1aSopenharmony_ci                              h->h264chroma.avg_h264_chroma_pixels_tab,
177cabdff1aSopenharmony_ci                              h->h264dsp.weight_h264_pixels_tab,
178cabdff1aSopenharmony_ci                              h->h264dsp.biweight_h264_pixels_tab);
179cabdff1aSopenharmony_ci            } else {
180cabdff1aSopenharmony_ci                FUNC(hl_motion_420)(h, sl, dest_y, dest_cb, dest_cr,
181cabdff1aSopenharmony_ci                              h->h264qpel.put_h264_qpel_pixels_tab,
182cabdff1aSopenharmony_ci                              h->h264chroma.put_h264_chroma_pixels_tab,
183cabdff1aSopenharmony_ci                              h->h264qpel.avg_h264_qpel_pixels_tab,
184cabdff1aSopenharmony_ci                              h->h264chroma.avg_h264_chroma_pixels_tab,
185cabdff1aSopenharmony_ci                              h->h264dsp.weight_h264_pixels_tab,
186cabdff1aSopenharmony_ci                              h->h264dsp.biweight_h264_pixels_tab);
187cabdff1aSopenharmony_ci            }
188cabdff1aSopenharmony_ci        }
189cabdff1aSopenharmony_ci
190cabdff1aSopenharmony_ci        hl_decode_mb_idct_luma(h, sl, mb_type, SIMPLE, transform_bypass,
191cabdff1aSopenharmony_ci                               PIXEL_SHIFT, block_offset, linesize, dest_y, 0);
192cabdff1aSopenharmony_ci
193cabdff1aSopenharmony_ci        if ((SIMPLE || !CONFIG_GRAY || !(h->flags & AV_CODEC_FLAG_GRAY)) &&
194cabdff1aSopenharmony_ci            (sl->cbp & 0x30)) {
195cabdff1aSopenharmony_ci            uint8_t *dest[2] = { dest_cb, dest_cr };
196cabdff1aSopenharmony_ci            if (transform_bypass) {
197cabdff1aSopenharmony_ci                if (IS_INTRA(mb_type) && h->ps.sps->profile_idc == 244 &&
198cabdff1aSopenharmony_ci                    (sl->chroma_pred_mode == VERT_PRED8x8 ||
199cabdff1aSopenharmony_ci                     sl->chroma_pred_mode == HOR_PRED8x8)) {
200cabdff1aSopenharmony_ci                    h->hpc.pred8x8_add[sl->chroma_pred_mode](dest[0],
201cabdff1aSopenharmony_ci                                                            block_offset + 16,
202cabdff1aSopenharmony_ci                                                            sl->mb + (16 * 16 * 1 << PIXEL_SHIFT),
203cabdff1aSopenharmony_ci                                                            uvlinesize);
204cabdff1aSopenharmony_ci                    h->hpc.pred8x8_add[sl->chroma_pred_mode](dest[1],
205cabdff1aSopenharmony_ci                                                            block_offset + 32,
206cabdff1aSopenharmony_ci                                                            sl->mb + (16 * 16 * 2 << PIXEL_SHIFT),
207cabdff1aSopenharmony_ci                                                            uvlinesize);
208cabdff1aSopenharmony_ci                } else {
209cabdff1aSopenharmony_ci                    idct_add = h->h264dsp.h264_add_pixels4_clear;
210cabdff1aSopenharmony_ci                    for (j = 1; j < 3; j++) {
211cabdff1aSopenharmony_ci                        for (i = j * 16; i < j * 16 + 4; i++)
212cabdff1aSopenharmony_ci                            if (sl->non_zero_count_cache[scan8[i]] ||
213cabdff1aSopenharmony_ci                                dctcoef_get(sl->mb, PIXEL_SHIFT, i * 16))
214cabdff1aSopenharmony_ci                                idct_add(dest[j - 1] + block_offset[i],
215cabdff1aSopenharmony_ci                                         sl->mb + (i * 16 << PIXEL_SHIFT),
216cabdff1aSopenharmony_ci                                         uvlinesize);
217cabdff1aSopenharmony_ci                        if (chroma422) {
218cabdff1aSopenharmony_ci                            for (i = j * 16 + 4; i < j * 16 + 8; i++)
219cabdff1aSopenharmony_ci                                if (sl->non_zero_count_cache[scan8[i + 4]] ||
220cabdff1aSopenharmony_ci                                    dctcoef_get(sl->mb, PIXEL_SHIFT, i * 16))
221cabdff1aSopenharmony_ci                                    idct_add(dest[j - 1] + block_offset[i + 4],
222cabdff1aSopenharmony_ci                                             sl->mb + (i * 16 << PIXEL_SHIFT),
223cabdff1aSopenharmony_ci                                             uvlinesize);
224cabdff1aSopenharmony_ci                        }
225cabdff1aSopenharmony_ci                    }
226cabdff1aSopenharmony_ci                }
227cabdff1aSopenharmony_ci            } else {
228cabdff1aSopenharmony_ci                int qp[2];
229cabdff1aSopenharmony_ci                if (chroma422) {
230cabdff1aSopenharmony_ci                    qp[0] = sl->chroma_qp[0] + 3;
231cabdff1aSopenharmony_ci                    qp[1] = sl->chroma_qp[1] + 3;
232cabdff1aSopenharmony_ci                } else {
233cabdff1aSopenharmony_ci                    qp[0] = sl->chroma_qp[0];
234cabdff1aSopenharmony_ci                    qp[1] = sl->chroma_qp[1];
235cabdff1aSopenharmony_ci                }
236cabdff1aSopenharmony_ci                if (sl->non_zero_count_cache[scan8[CHROMA_DC_BLOCK_INDEX + 0]])
237cabdff1aSopenharmony_ci                    h->h264dsp.h264_chroma_dc_dequant_idct(sl->mb + (16 * 16 * 1 << PIXEL_SHIFT),
238cabdff1aSopenharmony_ci                                                           h->ps.pps->dequant4_coeff[IS_INTRA(mb_type) ? 1 : 4][qp[0]][0]);
239cabdff1aSopenharmony_ci                if (sl->non_zero_count_cache[scan8[CHROMA_DC_BLOCK_INDEX + 1]])
240cabdff1aSopenharmony_ci                    h->h264dsp.h264_chroma_dc_dequant_idct(sl->mb + (16 * 16 * 2 << PIXEL_SHIFT),
241cabdff1aSopenharmony_ci                                                           h->ps.pps->dequant4_coeff[IS_INTRA(mb_type) ? 2 : 5][qp[1]][0]);
242cabdff1aSopenharmony_ci                h->h264dsp.h264_idct_add8(dest, block_offset,
243cabdff1aSopenharmony_ci                                          sl->mb, uvlinesize,
244cabdff1aSopenharmony_ci                                          sl->non_zero_count_cache);
245cabdff1aSopenharmony_ci            }
246cabdff1aSopenharmony_ci        }
247cabdff1aSopenharmony_ci    }
248cabdff1aSopenharmony_ci}
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci#if !SIMPLE || BITS == 8
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci#undef  CHROMA_IDC
253cabdff1aSopenharmony_ci#define CHROMA_IDC 3
254cabdff1aSopenharmony_ci#include "h264_mc_template.c"
255cabdff1aSopenharmony_ci
256cabdff1aSopenharmony_cistatic av_noinline void FUNC(hl_decode_mb_444)(const H264Context *h, H264SliceContext *sl)
257cabdff1aSopenharmony_ci{
258cabdff1aSopenharmony_ci    const int mb_x    = sl->mb_x;
259cabdff1aSopenharmony_ci    const int mb_y    = sl->mb_y;
260cabdff1aSopenharmony_ci    const int mb_xy   = sl->mb_xy;
261cabdff1aSopenharmony_ci    const int mb_type = h->cur_pic.mb_type[mb_xy];
262cabdff1aSopenharmony_ci    uint8_t *dest[3];
263cabdff1aSopenharmony_ci    int linesize;
264cabdff1aSopenharmony_ci    int i, j, p;
265cabdff1aSopenharmony_ci    const int *block_offset = &h->block_offset[0];
266cabdff1aSopenharmony_ci    const int transform_bypass = !SIMPLE && (sl->qscale == 0 && h->ps.sps->transform_bypass);
267cabdff1aSopenharmony_ci    const int plane_count      = (SIMPLE || !CONFIG_GRAY || !(h->flags & AV_CODEC_FLAG_GRAY)) ? 3 : 1;
268cabdff1aSopenharmony_ci
269cabdff1aSopenharmony_ci    for (p = 0; p < plane_count; p++) {
270cabdff1aSopenharmony_ci        dest[p] = h->cur_pic.f->data[p] +
271cabdff1aSopenharmony_ci                  ((mb_x << PIXEL_SHIFT) + mb_y * sl->linesize) * 16;
272cabdff1aSopenharmony_ci        h->vdsp.prefetch(dest[p] + (sl->mb_x & 3) * 4 * sl->linesize + (64 << PIXEL_SHIFT),
273cabdff1aSopenharmony_ci                         sl->linesize, 4);
274cabdff1aSopenharmony_ci    }
275cabdff1aSopenharmony_ci
276cabdff1aSopenharmony_ci    h->list_counts[mb_xy] = sl->list_count;
277cabdff1aSopenharmony_ci
278cabdff1aSopenharmony_ci    if (!SIMPLE && MB_FIELD(sl)) {
279cabdff1aSopenharmony_ci        linesize     = sl->mb_linesize = sl->mb_uvlinesize = sl->linesize * 2;
280cabdff1aSopenharmony_ci        block_offset = &h->block_offset[48];
281cabdff1aSopenharmony_ci        if (mb_y & 1) // FIXME move out of this function?
282cabdff1aSopenharmony_ci            for (p = 0; p < 3; p++)
283cabdff1aSopenharmony_ci                dest[p] -= sl->linesize * 15;
284cabdff1aSopenharmony_ci        if (FRAME_MBAFF(h)) {
285cabdff1aSopenharmony_ci            int list;
286cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
287cabdff1aSopenharmony_ci                if (!USES_LIST(mb_type, list))
288cabdff1aSopenharmony_ci                    continue;
289cabdff1aSopenharmony_ci                if (IS_16X16(mb_type)) {
290cabdff1aSopenharmony_ci                    int8_t *ref = &sl->ref_cache[list][scan8[0]];
291cabdff1aSopenharmony_ci                    fill_rectangle(ref, 4, 4, 8, (16 + *ref) ^ (sl->mb_y & 1), 1);
292cabdff1aSopenharmony_ci                } else {
293cabdff1aSopenharmony_ci                    for (i = 0; i < 16; i += 4) {
294cabdff1aSopenharmony_ci                        int ref = sl->ref_cache[list][scan8[i]];
295cabdff1aSopenharmony_ci                        if (ref >= 0)
296cabdff1aSopenharmony_ci                            fill_rectangle(&sl->ref_cache[list][scan8[i]], 2, 2,
297cabdff1aSopenharmony_ci                                           8, (16 + ref) ^ (sl->mb_y & 1), 1);
298cabdff1aSopenharmony_ci                    }
299cabdff1aSopenharmony_ci                }
300cabdff1aSopenharmony_ci            }
301cabdff1aSopenharmony_ci        }
302cabdff1aSopenharmony_ci    } else {
303cabdff1aSopenharmony_ci        linesize = sl->mb_linesize = sl->mb_uvlinesize = sl->linesize;
304cabdff1aSopenharmony_ci    }
305cabdff1aSopenharmony_ci
306cabdff1aSopenharmony_ci    if (!SIMPLE && IS_INTRA_PCM(mb_type)) {
307cabdff1aSopenharmony_ci        if (PIXEL_SHIFT) {
308cabdff1aSopenharmony_ci            const int bit_depth = h->ps.sps->bit_depth_luma;
309cabdff1aSopenharmony_ci            GetBitContext gb;
310cabdff1aSopenharmony_ci            init_get_bits(&gb, sl->intra_pcm_ptr, 768 * bit_depth);
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci            for (p = 0; p < plane_count; p++)
313cabdff1aSopenharmony_ci                for (i = 0; i < 16; i++) {
314cabdff1aSopenharmony_ci                    uint16_t *tmp = (uint16_t *)(dest[p] + i * linesize);
315cabdff1aSopenharmony_ci                    for (j = 0; j < 16; j++)
316cabdff1aSopenharmony_ci                        tmp[j] = get_bits(&gb, bit_depth);
317cabdff1aSopenharmony_ci                }
318cabdff1aSopenharmony_ci        } else {
319cabdff1aSopenharmony_ci            for (p = 0; p < plane_count; p++)
320cabdff1aSopenharmony_ci                for (i = 0; i < 16; i++)
321cabdff1aSopenharmony_ci                    memcpy(dest[p] + i * linesize,
322cabdff1aSopenharmony_ci                           sl->intra_pcm_ptr + p * 256 + i * 16, 16);
323cabdff1aSopenharmony_ci        }
324cabdff1aSopenharmony_ci    } else {
325cabdff1aSopenharmony_ci        if (IS_INTRA(mb_type)) {
326cabdff1aSopenharmony_ci            if (sl->deblocking_filter)
327cabdff1aSopenharmony_ci                xchg_mb_border(h, sl, dest[0], dest[1], dest[2], linesize,
328cabdff1aSopenharmony_ci                               linesize, 1, 1, SIMPLE, PIXEL_SHIFT);
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_ci            for (p = 0; p < plane_count; p++)
331cabdff1aSopenharmony_ci                hl_decode_mb_predict_luma(h, sl, mb_type, SIMPLE,
332cabdff1aSopenharmony_ci                                          transform_bypass, PIXEL_SHIFT,
333cabdff1aSopenharmony_ci                                          block_offset, linesize, dest[p], p);
334cabdff1aSopenharmony_ci
335cabdff1aSopenharmony_ci            if (sl->deblocking_filter)
336cabdff1aSopenharmony_ci                xchg_mb_border(h, sl, dest[0], dest[1], dest[2], linesize,
337cabdff1aSopenharmony_ci                               linesize, 0, 1, SIMPLE, PIXEL_SHIFT);
338cabdff1aSopenharmony_ci        } else {
339cabdff1aSopenharmony_ci            FUNC(hl_motion_444)(h, sl, dest[0], dest[1], dest[2],
340cabdff1aSopenharmony_ci                      h->h264qpel.put_h264_qpel_pixels_tab,
341cabdff1aSopenharmony_ci                      h->h264chroma.put_h264_chroma_pixels_tab,
342cabdff1aSopenharmony_ci                      h->h264qpel.avg_h264_qpel_pixels_tab,
343cabdff1aSopenharmony_ci                      h->h264chroma.avg_h264_chroma_pixels_tab,
344cabdff1aSopenharmony_ci                      h->h264dsp.weight_h264_pixels_tab,
345cabdff1aSopenharmony_ci                      h->h264dsp.biweight_h264_pixels_tab);
346cabdff1aSopenharmony_ci        }
347cabdff1aSopenharmony_ci
348cabdff1aSopenharmony_ci        for (p = 0; p < plane_count; p++)
349cabdff1aSopenharmony_ci            hl_decode_mb_idct_luma(h, sl, mb_type, SIMPLE, transform_bypass,
350cabdff1aSopenharmony_ci                                   PIXEL_SHIFT, block_offset, linesize,
351cabdff1aSopenharmony_ci                                   dest[p], p);
352cabdff1aSopenharmony_ci    }
353cabdff1aSopenharmony_ci}
354cabdff1aSopenharmony_ci
355cabdff1aSopenharmony_ci#endif
356