26 # define FUNC(n) AV_JOIN(n ## _simple_, BITS) 27 # define PIXEL_SHIFT (BITS >> 4) 29 # define FUNC(n) n ## _complex 30 # define PIXEL_SHIFT h->pixel_shift 43 const int mb_x = h->mb_x;
44 const int mb_y = h->mb_y;
45 const int mb_xy = h->mb_xy;
46 const int mb_type = h->cur_pic.mb_type[
mb_xy];
47 uint8_t *dest_y, *dest_cb, *dest_cr;
51 const int transform_bypass = !
SIMPLE && (h->qscale == 0 && h->sps.transform_bypass);
55 const int block_h = 16 >> h->chroma_y_shift;
58 dest_y = h->cur_pic.f.data[0] + ((mb_x <<
PIXEL_SHIFT) + mb_y * h->linesize) * 16;
59 dest_cb = h->cur_pic.f.data[1] + (mb_x <<
PIXEL_SHIFT) * 8 + mb_y * h->uvlinesize * block_h;
60 dest_cr = h->cur_pic.f.data[2] + (mb_x <<
PIXEL_SHIFT) * 8 + mb_y * h->uvlinesize * block_h;
62 h->vdsp.prefetch(dest_y + (h->mb_x & 3) * 4 * h->linesize + (64 <<
PIXEL_SHIFT), h->linesize, 4);
63 h->vdsp.prefetch(dest_cb + (h->mb_x & 7) * h->uvlinesize + (64 <<
PIXEL_SHIFT), dest_cr - dest_cb, 2);
65 h->list_counts[
mb_xy] = h->list_count;
68 linesize = h->mb_linesize = h->linesize * 2;
69 uvlinesize = h->mb_uvlinesize = h->uvlinesize * 2;
70 block_offset = &h->block_offset[48];
72 dest_y -= h->linesize * 15;
73 dest_cb -= h->uvlinesize * (block_h - 1);
74 dest_cr -= h->uvlinesize * (block_h - 1);
78 for (list = 0; list < h->list_count; list++) {
85 for (i = 0; i < 16; i += 4) {
89 8, (16 + ref) ^ (h->mb_y & 1), 1);
95 linesize = h->mb_linesize = h->linesize;
96 uvlinesize = h->mb_uvlinesize = h->uvlinesize;
101 const int bit_depth = h->sps.bit_depth_luma;
108 for (i = 0; i < 16; i++) {
109 uint16_t *tmp_y = (uint16_t *)(dest_y + i * linesize);
110 for (j = 0; j < 16; j++)
111 tmp_y[j] =
get_bits(&gb, bit_depth);
114 if (!h->sps.chroma_format_idc) {
115 for (i = 0; i < block_h; i++) {
116 uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize);
117 uint16_t *tmp_cr = (uint16_t *)(dest_cr + i * uvlinesize);
118 for (j = 0; j < 8; j++) {
119 tmp_cb[j] = tmp_cr[j] = 1 << (bit_depth - 1);
123 for (i = 0; i < block_h; i++) {
124 uint16_t *tmp_cb = (uint16_t *)(dest_cb + i * uvlinesize);
125 for (j = 0; j < 8; j++)
126 tmp_cb[j] =
get_bits(&gb, bit_depth);
128 for (i = 0; i < block_h; i++) {
129 uint16_t *tmp_cr = (uint16_t *)(dest_cr + i * uvlinesize);
130 for (j = 0; j < 8; j++)
131 tmp_cr[j] =
get_bits(&gb, bit_depth);
136 for (i = 0; i < 16; i++)
137 memcpy(dest_y + i * linesize, h->intra_pcm_ptr + i * 16, 16);
139 if (!h->sps.chroma_format_idc) {
140 for (i = 0; i < 8; i++) {
141 memset(dest_cb + i*uvlinesize, 1 << (bit_depth - 1), 8);
142 memset(dest_cr + i*uvlinesize, 1 << (bit_depth - 1), 8);
145 const uint8_t *src_cb = h->intra_pcm_ptr + 256;
146 const uint8_t *src_cr = h->intra_pcm_ptr + 256 + block_h * 8;
147 for (i = 0; i < block_h; i++) {
148 memcpy(dest_cb + i * uvlinesize, src_cb + i * 8, 8);
149 memcpy(dest_cr + i * uvlinesize, src_cr + i * 8, 8);
156 if (h->deblocking_filter)
161 h->hpc.pred8x8[h->chroma_pred_mode](dest_cb,
uvlinesize);
162 h->hpc.pred8x8[h->chroma_pred_mode](dest_cr,
uvlinesize);
167 block_offset, linesize, dest_y, 0);
169 if (h->deblocking_filter)
172 }
else if (is_h264) {
174 FUNC(hl_motion_422)(h, dest_y, dest_cb, dest_cr,
175 h->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab,
176 h->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab,
177 h->h264dsp.weight_h264_pixels_tab,
178 h->h264dsp.biweight_h264_pixels_tab);
180 FUNC(hl_motion_420)(h, dest_y, dest_cb, dest_cr,
181 h->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab,
182 h->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab,
183 h->h264dsp.weight_h264_pixels_tab,
184 h->h264dsp.biweight_h264_pixels_tab);
194 if (transform_bypass) {
195 if (
IS_INTRA(mb_type) && h->sps.profile_idc == 244 &&
198 h->hpc.pred8x8_add[h->chroma_pred_mode](dest[0],
202 h->hpc.pred8x8_add[h->chroma_pred_mode](dest[1],
207 idct_add = h->h264dsp.h264_add_pixels4_clear;
208 for (j = 1; j < 3; j++) {
209 for (i = j * 16; i < j * 16 + 4; i++)
210 if (h->non_zero_count_cache[
scan8[i]] ||
212 idct_add(dest[j - 1] + block_offset[i],
216 for (i = j * 16 + 4; i < j * 16 + 8; i++)
217 if (h->non_zero_count_cache[
scan8[i + 4]] ||
219 idct_add(dest[j - 1] + block_offset[i + 4],
229 qp[0] = h->chroma_qp[0] + 3;
230 qp[1] = h->chroma_qp[1] + 3;
232 qp[0] = h->chroma_qp[0];
233 qp[1] = h->chroma_qp[1];
236 h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + (16 * 16 * 1 <<
PIXEL_SHIFT),
237 h->dequant4_coeff[
IS_INTRA(mb_type) ? 1 : 4][qp[0]][0]);
239 h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + (16 * 16 * 2 <<
PIXEL_SHIFT),
240 h->dequant4_coeff[
IS_INTRA(mb_type) ? 2 : 5][qp[1]][0]);
241 h->h264dsp.h264_idct_add8(dest, block_offset,
243 h->non_zero_count_cache);
245 h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16 * 16 * 1,
246 h->dequant4_coeff[
IS_INTRA(mb_type) ? 1 : 4][h->chroma_qp[0]][0]);
247 h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16 * 16 * 2,
248 h->dequant4_coeff[
IS_INTRA(mb_type) ? 2 : 5][h->chroma_qp[1]][0]);
249 for (j = 1; j < 3; j++) {
250 for (i = j * 16; i < j * 16 + 4; i++)
251 if (h->non_zero_count_cache[
scan8[i]] || h->mb[i * 16]) {
252 uint8_t *
const ptr = dest[j - 1] + block_offset[
i];
264 #if !SIMPLE || BITS == 8 272 const int mb_x = h->mb_x;
273 const int mb_y = h->mb_y;
274 const int mb_xy = h->mb_xy;
275 const int mb_type = h->cur_pic.mb_type[
mb_xy];
280 const int transform_bypass = !
SIMPLE && (h->qscale == 0 && h->sps.transform_bypass);
283 for (p = 0; p < plane_count; p++) {
284 dest[p] = h->cur_pic.f.data[p] +
286 h->vdsp.prefetch(dest[p] + (h->mb_x & 3) * 4 * h->linesize + (64 <<
PIXEL_SHIFT),
290 h->list_counts[
mb_xy] = h->list_count;
293 linesize = h->mb_linesize = h->mb_uvlinesize = h->linesize * 2;
294 block_offset = &h->block_offset[48];
296 for (p = 0; p < 3; p++)
297 dest[p] -= h->linesize * 15;
300 for (list = 0; list < h->list_count; list++) {
307 for (i = 0; i < 16; i += 4) {
311 8, (16 + ref) ^ (h->mb_y & 1), 1);
317 linesize = h->mb_linesize = h->mb_uvlinesize = h->linesize;
322 const int bit_depth = h->sps.bit_depth_luma;
326 for (p = 0; p < plane_count; p++)
327 for (i = 0; i < 16; i++) {
328 uint16_t *tmp = (uint16_t *)(dest[p] + i * linesize);
329 for (j = 0; j < 16; j++)
333 for (p = 0; p < plane_count; p++)
334 for (i = 0; i < 16; i++)
335 memcpy(dest[p] + i * linesize,
336 h->intra_pcm_ptr + p * 256 + i * 16, 16);
340 if (h->deblocking_filter)
344 for (p = 0; p < plane_count; p++)
347 block_offset, linesize, dest[p], p);
349 if (h->deblocking_filter)
353 FUNC(hl_motion_444)(h, dest[0], dest[1], dest[2],
354 h->me.qpel_put, h->h264chroma.put_h264_chroma_pixels_tab,
355 h->me.qpel_avg, h->h264chroma.avg_h264_chroma_pixels_tab,
356 h->h264dsp.weight_h264_pixels_tab,
357 h->h264dsp.biweight_h264_pixels_tab);
360 for (p = 0; p < plane_count; p++)
#define CONFIG_SVQ3_DECODER
static av_always_inline void hl_decode_mb_predict_luma(H264Context *h, int mb_type, int is_h264, int simple, int transform_bypass, int pixel_shift, int *block_offset, int linesize, uint8_t *dest_y, int p)
FIXME Range Coding of cr are ref
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining list
#define USES_LIST(a, list)
does this mb use listX, note does not work if subMBs
static av_always_inline void hl_decode_mb_idct_luma(H264Context *h, int mb_type, int is_h264, int simple, int transform_bypass, int pixel_shift, int *block_offset, int linesize, uint8_t *dest_y, int p)
static av_noinline void FUNC() hl_decode_mb_444(H264Context *h)
static void fill_rectangle(SDL_Surface *screen, int x, int y, int w, int h, int color, int update)
const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM+1]
One chroma qp table for each possible bit depth (8-14).
#define CHROMA_DC_BLOCK_INDEX
static const uint8_t scan8[16 *3+3]
static av_always_inline void xchg_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_cb, uint8_t *src_cr, int linesize, int uvlinesize, int xchg, int chroma444, int simple, int pixel_shift)
void ff_svq3_add_idct_c(uint8_t *dst, int16_t *block, int stride, int qp, int dc)
static av_always_inline int dctcoef_get(int16_t *mb, int high_bit_depth, int index)
typedef void(RENAME(mix_any_func_type))
static void idct_add(uint8_t *dest, int line_size, int16_t *block)
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
int block_offset[2 *(16 *3)]
block_offset[ 0..23] for frame macroblocks block_offset[24..47] for field macroblocks ...
static av_noinline void FUNC() hl_decode_mb(H264Context *h)
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
const uint16_t ff_h264_mb_sizes[4]
else dst[i][x+y *dst_stride[i]]