28#include "config_components.h"
53 0 + 0 * 4, 0 + 1 * 4, 1 + 0 * 4, 0 + 2 * 4,
54 0 + 3 * 4, 1 + 1 * 4, 1 + 2 * 4, 1 + 3 * 4,
55 2 + 0 * 4, 2 + 1 * 4, 2 + 2 * 4, 2 + 3 * 4,
56 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4, 3 + 3 * 4,
60 0 + 0 * 8, 0 + 1 * 8, 0 + 2 * 8, 1 + 0 * 8,
61 1 + 1 * 8, 0 + 3 * 8, 0 + 4 * 8, 1 + 2 * 8,
62 2 + 0 * 8, 1 + 3 * 8, 0 + 5 * 8, 0 + 6 * 8,
63 0 + 7 * 8, 1 + 4 * 8, 2 + 1 * 8, 3 + 0 * 8,
64 2 + 2 * 8, 1 + 5 * 8, 1 + 6 * 8, 1 + 7 * 8,
65 2 + 3 * 8, 3 + 1 * 8, 4 + 0 * 8, 3 + 2 * 8,
66 2 + 4 * 8, 2 + 5 * 8, 2 + 6 * 8, 2 + 7 * 8,
67 3 + 3 * 8, 4 + 1 * 8, 5 + 0 * 8, 4 + 2 * 8,
68 3 + 4 * 8, 3 + 5 * 8, 3 + 6 * 8, 3 + 7 * 8,
69 4 + 3 * 8, 5 + 1 * 8, 6 + 0 * 8, 5 + 2 * 8,
70 4 + 4 * 8, 4 + 5 * 8, 4 + 6 * 8, 4 + 7 * 8,
71 5 + 3 * 8, 6 + 1 * 8, 6 + 2 * 8, 5 + 4 * 8,
72 5 + 5 * 8, 5 + 6 * 8, 5 + 7 * 8, 6 + 3 * 8,
73 7 + 0 * 8, 7 + 1 * 8, 6 + 4 * 8, 6 + 5 * 8,
74 6 + 6 * 8, 6 + 7 * 8, 7 + 2 * 8, 7 + 3 * 8,
75 7 + 4 * 8, 7 + 5 * 8, 7 + 6 * 8, 7 + 7 * 8,
79 0 + 0 * 8, 1 + 1 * 8, 2 + 0 * 8, 0 + 7 * 8,
80 2 + 2 * 8, 2 + 3 * 8, 2 + 4 * 8, 3 + 3 * 8,
81 3 + 4 * 8, 4 + 3 * 8, 4 + 4 * 8, 5 + 3 * 8,
82 5 + 5 * 8, 7 + 0 * 8, 6 + 6 * 8, 7 + 4 * 8,
83 0 + 1 * 8, 0 + 3 * 8, 1 + 3 * 8, 1 + 4 * 8,
84 1 + 5 * 8, 3 + 1 * 8, 2 + 5 * 8, 4 + 1 * 8,
85 3 + 5 * 8, 5 + 1 * 8, 4 + 5 * 8, 6 + 1 * 8,
86 5 + 6 * 8, 7 + 1 * 8, 6 + 7 * 8, 7 + 5 * 8,
87 0 + 2 * 8, 0 + 4 * 8, 0 + 5 * 8, 2 + 1 * 8,
88 1 + 6 * 8, 4 + 0 * 8, 2 + 6 * 8, 5 + 0 * 8,
89 3 + 6 * 8, 6 + 0 * 8, 4 + 6 * 8, 6 + 2 * 8,
90 5 + 7 * 8, 6 + 4 * 8, 7 + 2 * 8, 7 + 6 * 8,
91 1 + 0 * 8, 1 + 2 * 8, 0 + 6 * 8, 3 + 0 * 8,
92 1 + 7 * 8, 3 + 2 * 8, 2 + 7 * 8, 4 + 2 * 8,
93 3 + 7 * 8, 5 + 2 * 8, 4 + 7 * 8, 5 + 4 * 8,
94 6 + 3 * 8, 6 + 5 * 8, 7 + 3 * 8, 7 + 7 * 8,
99 0 + 0 * 8, 1 + 1 * 8, 1 + 2 * 8, 2 + 2 * 8,
100 4 + 1 * 8, 0 + 5 * 8, 3 + 3 * 8, 7 + 0 * 8,
101 3 + 4 * 8, 1 + 7 * 8, 5 + 3 * 8, 6 + 3 * 8,
102 2 + 7 * 8, 6 + 4 * 8, 5 + 6 * 8, 7 + 5 * 8,
103 1 + 0 * 8, 2 + 0 * 8, 0 + 3 * 8, 3 + 1 * 8,
104 3 + 2 * 8, 0 + 6 * 8, 4 + 2 * 8, 6 + 1 * 8,
105 2 + 5 * 8, 2 + 6 * 8, 6 + 2 * 8, 5 + 4 * 8,
106 3 + 7 * 8, 7 + 3 * 8, 4 + 7 * 8, 7 + 6 * 8,
107 0 + 1 * 8, 3 + 0 * 8, 0 + 4 * 8, 4 + 0 * 8,
108 2 + 3 * 8, 1 + 5 * 8, 5 + 1 * 8, 5 + 2 * 8,
109 1 + 6 * 8, 3 + 5 * 8, 7 + 1 * 8, 4 + 5 * 8,
110 4 + 6 * 8, 7 + 4 * 8, 5 + 7 * 8, 6 + 7 * 8,
111 0 + 2 * 8, 2 + 1 * 8, 1 + 3 * 8, 5 + 0 * 8,
112 1 + 4 * 8, 2 + 4 * 8, 6 + 0 * 8, 4 + 3 * 8,
113 0 + 7 * 8, 4 + 4 * 8, 7 + 2 * 8, 3 + 6 * 8,
114 5 + 5 * 8, 6 + 5 * 8, 6 + 6 * 8, 7 + 7 * 8,
123 if (
h->DPB[
i].f->buf[0] && !
h->DPB[
i].reference &&
124 (remove_current || &
h->DPB[
i] !=
h->cur_pic_ptr)) {
141 h->mb_width * 16 * 3 *
sizeof(uint8_t) * 2);
143 h->mb_width * 16 * 3 *
sizeof(uint8_t) * 2);
164 const int big_mb_num =
h->mb_stride * (
h->mb_height + 1) + 1;
165 const int mb_array_size =
h->mb_stride *
h->mb_height;
166 const int b4_stride =
h->mb_width * 4 + 1;
167 const int b4_array_size = b4_stride *
h->mb_height * 4;
171 sizeof(uint32_t), 0);
176 if (!
h->qscale_table_pool || !
h->mb_type_pool || !
h->motion_val_pool ||
177 !
h->ref_index_pool) {
194 if (
h->sei.common.itut_t35.lcevc) {
219 if (
h->decode_error_flags_pool) {
227 int h_chroma_shift, v_chroma_shift;
229 &h_chroma_shift, &v_chroma_shift);
239 if (!
h->qscale_table_pool) {
253 for (
i = 0;
i < 2;
i++) {
271 return (ret < 0) ? ret :
AVERROR(ENOMEM);
279 if (!
h->DPB[
i].f->buf[0])
286#define IN_RANGE(a, b, size) (((void*)(a) >= (void*)(b)) && ((void*)(a) < (void*)((b) + (size))))
288#define REBASE_PICTURE(pic, new_ctx, old_ctx) \
289 (((pic) && (pic) >= (old_ctx)->DPB && \
290 (pic) < (old_ctx)->DPB + H264_MAX_PICTURE_COUNT) ? \
291 &(new_ctx)->DPB[(pic) - (old_ctx)->DPB] : NULL)
298 for (
i = 0;
i < count;
i++) {
312 for (
int p = 0; p <
desc->nb_components; p++) {
314 int is_chroma = p == 1 || p == 2;
317 if (
desc->comp[0].depth >= 9) {
319 ((uint16_t*)
dst)[0] =
c[p];
323 for (
int y = 1; y <
height; y++) {
324 memcpy(
dst,
frame->data[p], 2*bytes);
328 for (
int y = 0; y <
height; y++) {
329 memset(
dst,
c[p], bytes);
342 int inited =
h->context_initialized, err = 0;
349 if (inited && !h1->ps.sps)
353 (
h->width != h1->width ||
354 h->height != h1->height ||
355 h->mb_width != h1->mb_width ||
356 h->mb_height != h1->mb_height ||
358 h->ps.sps->bit_depth_luma != h1->ps.sps->bit_depth_luma ||
359 h->ps.sps->chroma_format_idc != h1->ps.sps->chroma_format_idc ||
360 h->ps.sps->vui.matrix_coeffs != h1->ps.sps->vui.matrix_coeffs)) {
365 memcpy(
h->block_offset, h1->block_offset,
sizeof(
h->block_offset));
374 h->ps.sps = h1->ps.sps;
376 if (need_reinit || !inited) {
377 h->width = h1->width;
378 h->height = h1->height;
379 h->mb_height = h1->mb_height;
380 h->mb_width = h1->mb_width;
381 h->mb_num = h1->mb_num;
382 h->mb_stride = h1->mb_stride;
383 h->b_stride = h1->b_stride;
384 h->x264_build = h1->x264_build;
386 if (
h->context_initialized || h1->context_initialized) {
394 memcpy(
h->block_offset, h1->block_offset,
sizeof(
h->block_offset));
397 h->width_from_caller = h1->width_from_caller;
398 h->height_from_caller = h1->height_from_caller;
399 h->first_field = h1->first_field;
400 h->picture_structure = h1->picture_structure;
401 h->mb_aff_frame = h1->mb_aff_frame;
402 h->droppable = h1->droppable;
415 h->enable_er = h1->enable_er;
416 h->workaround_bugs = h1->workaround_bugs;
417 h->droppable = h1->droppable;
420 h->is_avc = h1->is_avc;
421 h->nal_length_size = h1->nal_length_size;
423 memcpy(&
h->poc, &h1->poc,
sizeof(
h->poc));
425 memcpy(
h->short_ref, h1->short_ref,
sizeof(
h->short_ref));
426 memcpy(
h->long_ref, h1->long_ref,
sizeof(
h->long_ref));
427 memcpy(
h->delayed_pic, h1->delayed_pic,
sizeof(
h->delayed_pic));
428 memcpy(
h->last_pocs, h1->last_pocs,
sizeof(
h->last_pocs));
430 h->next_output_pic = h1->next_output_pic;
431 h->next_outputed_poc = h1->next_outputed_poc;
432 h->poc_offset = h1->poc_offset;
434 memcpy(
h->mmco, h1->mmco,
sizeof(
h->mmco));
435 h->nb_mmco = h1->nb_mmco;
436 h->mmco_reset = h1->mmco_reset;
437 h->explicit_ref_marking = h1->explicit_ref_marking;
438 h->long_ref_count = h1->long_ref_count;
439 h->short_ref_count = h1->short_ref_count;
446 h->frame_recovered = h1->frame_recovered;
452 h->sei.common.unregistered.x264_build = h1->sei.common.unregistered.x264_build;
459 h->poc.prev_poc_msb =
h->poc.poc_msb;
460 h->poc.prev_poc_lsb =
h->poc.poc_lsb;
462 h->poc.prev_frame_num_offset =
h->poc.frame_num_offset;
463 h->poc.prev_frame_num =
h->poc.frame_num;
465 h->recovery_frame = h1->recovery_frame;
466 h->non_gray = h1->non_gray;
487 const int pixel_shift =
h->pixel_shift;
495 h->cur_pic_ptr =
NULL;
504 pic->
reference =
h->droppable ? 0 :
h->picture_structure;
526 h->sei.common.film_grain_characteristics &&
527 h->sei.common.film_grain_characteristics->present &&
528 !
h->avctx->hwaccel &&
534 h->cur_pic_ptr = pic;
536 if (CONFIG_ERROR_RESILIENCE) {
543 for (
i = 0;
i <
h->nb_slice_ctx;
i++) {
544 h->slice_ctx[
i].linesize =
h->cur_pic_ptr->f->linesize[0];
545 h->slice_ctx[
i].uvlinesize =
h->cur_pic_ptr->f->linesize[1];
548 if (CONFIG_ERROR_RESILIENCE &&
h->enable_er) {
554 for (
i = 0;
i < 16;
i++) {
558 for (
i = 0;
i < 16;
i++) {
559 h->block_offset[16 +
i] =
561 h->block_offset[48 + 16 +
i] =
569 h->cur_pic_ptr->reference = 0;
571 h->cur_pic_ptr->field_poc[0] =
h->cur_pic_ptr->field_poc[1] = INT_MAX;
573 h->next_output_pic =
NULL;
575 h->postpone_filter = 0;
577 h->mb_aff_frame =
h->ps.sps->mb_aff && (
h->picture_structure ==
PICT_FRAME);
579 if (
h->sei.common.unregistered.x264_build >= 0)
580 h->x264_build =
h->sei.common.unregistered.x264_build;
582 assert(
h->cur_pic_ptr->long_ref == 0);
588 const uint8_t *src_y,
589 const uint8_t *src_cb,
const uint8_t *src_cr,
590 int linesize,
int uvlinesize,
595 const int pixel_shift =
h->pixel_shift;
600 src_cb -= uvlinesize;
601 src_cr -= uvlinesize;
607 AV_COPY128(top_border, src_y + 15 * linesize);
609 AV_COPY128(top_border + 16, src_y + 15 * linesize + 16);
613 AV_COPY128(top_border + 32, src_cb + 15 * uvlinesize);
614 AV_COPY128(top_border + 48, src_cb + 15 * uvlinesize + 16);
615 AV_COPY128(top_border + 64, src_cr + 15 * uvlinesize);
616 AV_COPY128(top_border + 80, src_cr + 15 * uvlinesize + 16);
618 AV_COPY128(top_border + 16, src_cb + 15 * uvlinesize);
619 AV_COPY128(top_border + 32, src_cr + 15 * uvlinesize);
621 }
else if (chroma422) {
623 AV_COPY128(top_border + 32, src_cb + 15 * uvlinesize);
624 AV_COPY128(top_border + 48, src_cr + 15 * uvlinesize);
626 AV_COPY64(top_border + 16, src_cb + 15 * uvlinesize);
627 AV_COPY64(top_border + 24, src_cr + 15 * uvlinesize);
631 AV_COPY128(top_border + 32, src_cb + 7 * uvlinesize);
632 AV_COPY128(top_border + 48, src_cr + 7 * uvlinesize);
634 AV_COPY64(top_border + 16, src_cb + 7 * uvlinesize);
635 AV_COPY64(top_border + 24, src_cr + 7 * uvlinesize);
649 AV_COPY128(top_border, src_y + 16 * linesize);
651 AV_COPY128(top_border + 16, src_y + 16 * linesize + 16);
656 AV_COPY128(top_border + 32, src_cb + 16 * linesize);
657 AV_COPY128(top_border + 48, src_cb + 16 * linesize + 16);
658 AV_COPY128(top_border + 64, src_cr + 16 * linesize);
659 AV_COPY128(top_border + 80, src_cr + 16 * linesize + 16);
661 AV_COPY128(top_border + 16, src_cb + 16 * linesize);
662 AV_COPY128(top_border + 32, src_cr + 16 * linesize);
664 }
else if (chroma422) {
666 AV_COPY128(top_border + 32, src_cb + 16 * uvlinesize);
667 AV_COPY128(top_border + 48, src_cr + 16 * uvlinesize);
669 AV_COPY64(top_border + 16, src_cb + 16 * uvlinesize);
670 AV_COPY64(top_border + 24, src_cr + 16 * uvlinesize);
674 AV_COPY128(top_border + 32, src_cb + 8 * uvlinesize);
675 AV_COPY128(top_border + 48, src_cr + 8 * uvlinesize);
677 AV_COPY64(top_border + 16, src_cb + 8 * uvlinesize);
678 AV_COPY64(top_border + 24, src_cr + 8 * uvlinesize);
691 int ref0, ref1,
i, cur_poc, ref_start, ref_count0, ref_count1;
693 for (
i = 0;
i < 2;
i++) {
700 cur_poc =
h->cur_pic_ptr->poc;
702 cur_poc =
h->cur_pic_ptr->field_poc[
h->picture_structure - 1];
714 cur_poc =
h->cur_pic_ptr->field_poc[field];
725 for (ref0 = ref_start; ref0 < ref_count0; ref0++) {
727 for (ref1 = ref_start; ref1 < ref_count1; ref1++) {
734 int tx = (16384 + (
FFABS(td) >> 1)) / td;
735 int dist_scale_factor = (tb * tx + 32) >> 8;
736 if (dist_scale_factor >= -64 && dist_scale_factor <= 128)
737 w = 64 - dist_scale_factor;
756 for (
i = 0;
i < 16;
i++) {
757#define TRANSPOSE(x) ((x) >> 2) | (((x) << 2) & 0xF)
762 for (
i = 0;
i < 64;
i++) {
763#define TRANSPOSE(x) ((x) >> 3) | (((x) & 7) << 3)
770 if (
h->ps.sps->transform_bypass) {
774 memcpy(
h->field_scan_q0 ,
field_scan ,
sizeof(
h->field_scan_q0 ));
775 memcpy(
h->field_scan8x8_q0 ,
field_scan8x8 ,
sizeof(
h->field_scan8x8_q0 ));
778 memcpy(
h->zigzag_scan_q0 ,
h->zigzag_scan ,
sizeof(
h->zigzag_scan_q0 ));
779 memcpy(
h->zigzag_scan8x8_q0 ,
h->zigzag_scan8x8 ,
sizeof(
h->zigzag_scan8x8_q0 ));
780 memcpy(
h->zigzag_scan8x8_cavlc_q0 ,
h->zigzag_scan8x8_cavlc ,
sizeof(
h->zigzag_scan8x8_cavlc_q0));
781 memcpy(
h->field_scan_q0 ,
h->field_scan ,
sizeof(
h->field_scan_q0 ));
782 memcpy(
h->field_scan8x8_q0 ,
h->field_scan8x8 ,
sizeof(
h->field_scan8x8_q0 ));
783 memcpy(
h->field_scan8x8_cavlc_q0 ,
h->field_scan8x8_cavlc ,
sizeof(
h->field_scan8x8_cavlc_q0 ));
789#define HWACCEL_MAX (CONFIG_H264_DXVA2_HWACCEL + \
790 (CONFIG_H264_D3D11VA_HWACCEL * 2) + \
791 CONFIG_H264_D3D12VA_HWACCEL + \
792 CONFIG_H264_NVDEC_HWACCEL + \
793 CONFIG_H264_NVDEC_CUARRAY_HWACCEL + \
794 CONFIG_H264_VAAPI_HWACCEL + \
795 CONFIG_H264_VIDEOTOOLBOX_HWACCEL + \
796 CONFIG_H264_VDPAU_HWACCEL + \
797 CONFIG_H264_VULKAN_HWACCEL)
800 switch (
h->ps.sps->bit_depth_luma) {
813#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL
817#if CONFIG_H264_VULKAN_HWACCEL
820#if CONFIG_H264_NVDEC_HWACCEL
823#if CONFIG_H264_NVDEC_CUARRAY_HWACCEL
834#if CONFIG_H264_VAAPI_HWACCEL
844#if CONFIG_H264_VULKAN_HWACCEL
869#if CONFIG_H264_VDPAU_HWACCEL
872#if CONFIG_H264_VULKAN_HWACCEL
875#if CONFIG_H264_NVDEC_HWACCEL
878#if CONFIG_H264_NVDEC_CUARRAY_HWACCEL
881#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL
898#if CONFIG_H264_DXVA2_HWACCEL
901#if CONFIG_H264_D3D11VA_HWACCEL
905#if CONFIG_H264_D3D12VA_HWACCEL
908#if CONFIG_H264_VAAPI_HWACCEL
919 "Unsupported bit depth %d\n",
h->ps.sps->bit_depth_luma);
926 if (
pix_fmts[
i] ==
h->avctx->pix_fmt && !force_callback)
935 int cr =
sps->crop_right;
936 int cl =
sps->crop_left;
937 int ct =
sps->crop_top;
938 int cb =
sps->crop_bottom;
945 if (
h->width_from_caller > 0 &&
h->height_from_caller > 0 &&
946 !
sps->crop_top && !
sps->crop_left &&
949 h->width_from_caller <=
width &&
950 h->height_from_caller <=
height) {
951 width =
h->width_from_caller;
952 height =
h->height_from_caller;
958 h->width_from_caller = 0;
959 h->height_from_caller = 0;
962 h->avctx->coded_width =
h->width;
963 h->avctx->coded_height =
h->height;
984 &
h->chroma_x_shift, &
h->chroma_y_shift);
986 if (
sps->timing_info_present_flag) {
988 if (
h->x264_build < 44U)
990 av_reduce(&
h->avctx->framerate.den, &
h->avctx->framerate.num,
991 sps->num_units_in_tick * 2, den, 1 << 30);
997 h->prev_interlaced_frame = 1;
1006 if (
sps->bit_depth_luma < 8 ||
sps->bit_depth_luma > 14 ||
1007 sps->bit_depth_luma == 11 ||
sps->bit_depth_luma == 13
1010 sps->bit_depth_luma);
1015 h->cur_bit_depth_luma =
1016 h->avctx->bits_per_raw_sample =
sps->bit_depth_luma;
1017 h->cur_chroma_format_idc =
sps->chroma_format_idc;
1018 h->pixel_shift =
sps->bit_depth_luma > 8;
1019 h->chroma_format_idc =
sps->chroma_format_idc;
1020 h->bit_depth_luma =
sps->bit_depth_luma;
1023 sps->chroma_format_idc);
1027 sps->chroma_format_idc);
1033 for (
i = 0;
i <
h->nb_slice_ctx;
i++) {
1038 sl->
mvd_table[0] =
h->mvd_table[0] +
i * 8 * 2 *
h->mb_stride;
1039 sl->
mvd_table[1] =
h->mvd_table[1] +
i * 8 * 2 *
h->mb_stride;
1045 h->context_initialized = 1;
1050 h->context_initialized = 0;
1068 int needs_reinit = 0, must_reinit, ret;
1073 if (
h->ps.sps !=
h->ps.pps->sps) {
1074 h->ps.sps =
h->ps.pps->sps;
1076 if (
h->mb_width !=
h->ps.sps->mb_width ||
1077 h->mb_height !=
h->ps.sps->mb_height ||
1078 h->cur_bit_depth_luma !=
h->ps.sps->bit_depth_luma ||
1079 h->cur_chroma_format_idc !=
h->ps.sps->chroma_format_idc
1083 if (
h->bit_depth_luma !=
h->ps.sps->bit_depth_luma ||
1084 h->chroma_format_idc !=
h->ps.sps->chroma_format_idc)
1089 must_reinit = (
h->context_initialized &&
1090 ( 16*
sps->mb_width !=
h->avctx->coded_width
1091 || 16*
sps->mb_height !=
h->avctx->coded_height
1092 ||
h->cur_bit_depth_luma !=
sps->bit_depth_luma
1093 ||
h->cur_chroma_format_idc !=
sps->chroma_format_idc
1094 ||
h->mb_width !=
sps->mb_width
1095 ||
h->mb_height !=
sps->mb_height
1101 if (first_slice &&
av_cmp_q(
sps->vui.sar,
h->avctx->sample_aspect_ratio))
1104 if (!
h->setup_finished) {
1106 h->avctx->level =
sps->level_idc;
1107 h->avctx->refs =
sps->ref_frame_count;
1109 h->mb_width =
sps->mb_width;
1110 h->mb_height =
sps->mb_height;
1111 h->mb_num =
h->mb_width *
h->mb_height;
1112 h->mb_stride =
h->mb_width + 1;
1114 h->b_stride =
h->mb_width * 4;
1116 h->chroma_y_shift =
sps->chroma_format_idc <= 1;
1118 h->width = 16 *
h->mb_width;
1119 h->height = 16 *
h->mb_height;
1123 if (
sps->vui.video_signal_type_present_flag) {
1126 if (
sps->vui.colour_description_present_flag) {
1127 if (
h->avctx->colorspace !=
sps->vui.matrix_coeffs)
1129 h->avctx->color_primaries =
sps->vui.colour_primaries;
1130 h->avctx->color_trc =
sps->vui.transfer_characteristics;
1131 h->avctx->colorspace =
sps->vui.matrix_coeffs;
1135 if (
h->sei.common.alternative_transfer.present &&
1138 h->avctx->color_trc =
h->sei.common.alternative_transfer.preferred_transfer_characteristics;
1141 h->avctx->chroma_sample_location =
sps->vui.chroma_location;
1143 if (!
h->context_initialized || must_reinit || needs_reinit) {
1144 int flush_changes =
h->context_initialized;
1145 h->context_initialized = 0;
1146 if (sl !=
h->slice_ctx) {
1148 "changing width %d -> %d / height %d -> %d on "
1150 h->width,
h->avctx->coded_width,
1151 h->height,
h->avctx->coded_height,
1152 h->current_slice + 1);
1163 h->avctx->pix_fmt = ret;
1170 "h264_slice_header_init() failed\n");
1183 int interlaced_frame = 0, top_field_first = 0;
1187 out->repeat_pict = 0;
1192 if (
h->sei.picture_timing.present) {
1199 h->sei.picture_timing.present = 0;
1203 if (
sps->pic_struct_present_flag &&
h->sei.picture_timing.present) {
1205 switch (
pt->pic_struct) {
1210 interlaced_frame = 1;
1215 interlaced_frame = 1;
1218 interlaced_frame = !!
h->prev_interlaced_frame;
1225 out->repeat_pict = 1;
1228 out->repeat_pict = 2;
1231 out->repeat_pict = 4;
1235 if ((
pt->ct_type & 3) &&
1237 interlaced_frame = ((
pt->ct_type & (1 << 1)) != 0);
1242 h->prev_interlaced_frame = interlaced_frame;
1248 if (
sps->pic_struct_present_flag &&
h->sei.picture_timing.present) {
1253 top_field_first = 1;
1254 }
else if (interlaced_frame) {
1257 top_field_first = 1;
1266 &
sps->vui,
sps->bit_depth_luma,
sps->bit_depth_chroma,
1267 cur->
poc + (
unsigned)(
h->poc_offset << 5));
1271 if (
h->sei.picture_timing.timecode_cnt > 0) {
1276 sizeof(uint32_t)*4, &tcside);
1281 tc_sd = (uint32_t*)tcside->
data;
1282 tc_sd[0] =
h->sei.picture_timing.timecode_cnt;
1284 for (
int i = 0;
i < tc_sd[0];
i++) {
1285 int drop =
h->sei.picture_timing.timecode[
i].dropframe;
1286 int hh =
h->sei.picture_timing.timecode[
i].hours;
1287 int mm =
h->sei.picture_timing.timecode[
i].minutes;
1288 int ss =
h->sei.picture_timing.timecode[
i].seconds;
1289 int ff =
h->sei.picture_timing.timecode[
i].frame;
1296 h->sei.picture_timing.timecode_cnt = 0;
1307 int i, pics, out_of_order, out_idx;
1312 if (
sps->bitstream_restriction_flag ||
1314 h->avctx->has_b_frames =
FFMAX(
h->avctx->has_b_frames,
sps->num_reorder_frames);
1317 for (
i = 0; 1;
i++) {
1320 h->last_pocs[
i-1] = cur->
poc;
1323 h->last_pocs[
i-1]=
h->last_pocs[
i];
1329 out_of_order =
FFMAX(out_of_order, 1);
1333 h->last_pocs[
i] = INT_MIN;
1334 h->last_pocs[0] = cur->
poc;
1336 }
else if(
h->avctx->has_b_frames < out_of_order && !
sps->bitstream_restriction_flag){
1338 av_log(
h->avctx, loglevel,
"Increasing reorder buffer to %d\n", out_of_order);
1339 h->avctx->has_b_frames = out_of_order;
1343 while (
h->delayed_pic[pics])
1348 h->delayed_pic[pics++] = cur;
1352 out =
h->delayed_pic[0];
1354 for (
i = 1;
h->delayed_pic[
i] &&
1356 !
h->delayed_pic[
i]->mmco_reset;
1358 if (
h->delayed_pic[
i]->poc <
out->poc) {
1359 out =
h->delayed_pic[
i];
1362 if (
h->avctx->has_b_frames == 0 &&
1364 h->next_outputed_poc = INT_MIN;
1365 out_of_order =
out->poc <
h->next_outputed_poc;
1367 if (out_of_order || pics >
h->avctx->has_b_frames) {
1369 for (
i = out_idx;
h->delayed_pic[
i];
i++)
1370 h->delayed_pic[
i] =
h->delayed_pic[
i + 1];
1372 if (!out_of_order && pics >
h->avctx->has_b_frames) {
1373 h->next_output_pic =
out;
1374 if (out_idx == 0 &&
h->delayed_pic[0] && ((
h->delayed_pic[0]->f->flags &
AV_FRAME_FLAG_KEY) ||
h->delayed_pic[0]->mmco_reset)) {
1375 h->next_outputed_poc = INT_MIN;
1377 h->next_outputed_poc =
out->poc;
1381 h->frame_recovered |=
out->recovered;
1385 if (!
out->recovered) {
1388 h->next_output_pic =
NULL;
1410 int last_pic_structure, last_pic_droppable, ret;
1418 if (
sps->bitstream_restriction_flag &&
1419 h->avctx->has_b_frames <
sps->num_reorder_frames) {
1420 h->avctx->has_b_frames =
sps->num_reorder_frames;
1423 last_pic_droppable =
h->droppable;
1424 last_pic_structure =
h->picture_structure;
1425 h->droppable = (
nal->ref_idc == 0);
1436 else if (
h->picture_intra_only)
1441 if (
h->poc.frame_num !=
h->poc.prev_frame_num) {
1442 int unwrap_prev_frame_num =
h->poc.prev_frame_num;
1443 int max_frame_num = 1 <<
sps->log2_max_frame_num;
1445 if (unwrap_prev_frame_num >
h->poc.frame_num)
1446 unwrap_prev_frame_num -= max_frame_num;
1448 if ((
h->poc.frame_num - unwrap_prev_frame_num) >
sps->ref_frame_count) {
1449 unwrap_prev_frame_num = (
h->poc.frame_num -
sps->ref_frame_count) - 1;
1450 if (unwrap_prev_frame_num < 0)
1451 unwrap_prev_frame_num += max_frame_num;
1453 h->poc.prev_frame_num = unwrap_prev_frame_num;
1462 if (
h->first_field) {
1469 if (
h->cur_pic_ptr->tf.owner[last_field] ==
h->avctx) {
1474 if (!
FIELD_PICTURE(
h) ||
h->picture_structure == last_pic_structure) {
1482 if (
h->cur_pic_ptr->frame_num !=
h->poc.frame_num) {
1498 "Invalid field mode combination %d/%d\n",
1499 last_pic_structure,
h->picture_structure);
1500 h->picture_structure = last_pic_structure;
1501 h->droppable = last_pic_droppable;
1503 }
else if (last_pic_droppable !=
h->droppable) {
1505 "Found reference and non-reference fields in the same frame, which");
1506 h->picture_structure = last_pic_structure;
1507 h->droppable = last_pic_droppable;
1514 while (
h->poc.frame_num !=
h->poc.prev_frame_num && !
h->first_field &&
1515 h->poc.frame_num != (
h->poc.prev_frame_num + 1) % (1 <<
sps->log2_max_frame_num)) {
1518 h->poc.frame_num,
h->poc.prev_frame_num);
1519 if (!
sps->gaps_in_frame_num_allowed_flag)
1521 h->last_pocs[
i] = INT_MIN;
1528 h->poc.prev_frame_num++;
1529 h->poc.prev_frame_num %= 1 <<
sps->log2_max_frame_num;
1530 h->cur_pic_ptr->frame_num =
h->poc.prev_frame_num;
1531 h->cur_pic_ptr->invalid_gap = !
sps->gaps_in_frame_num_allowed_flag;
1535 h->explicit_ref_marking = 0;
1546 if (
h->short_ref_count) {
1548 1<<(
h->ps.sps->bit_depth_luma-1),
1549 1<<(
h->ps.sps->bit_depth_chroma-1),
1550 1<<(
h->ps.sps->bit_depth_chroma-1),
1555 h->short_ref[0]->f->width == prev->
f->
width &&
1556 h->short_ref[0]->f->height == prev->
f->
height &&
1557 h->short_ref[0]->f->format == prev->
f->
format) {
1562 h->short_ref[0]->tf.f =
h->short_ref[0]->f;
1566 h->short_ref[0]->poc = prev->
poc + 2U;
1567 h->short_ref[0]->gray = prev->
gray;
1569 if (
h->short_ref[0]->field_picture)
1571 }
else if (!
h->frame_recovered) {
1572 if (!
h->avctx->hwaccel)
1574 h->short_ref[0]->gray = 1;
1576 h->short_ref[0]->frame_num =
h->poc.prev_frame_num;
1583 if (
h->first_field) {
1589 if (!
FIELD_PICTURE(
h) ||
h->picture_structure == last_pic_structure) {
1592 h->missing_fields ++;
1593 h->cur_pic_ptr =
NULL;
1596 h->missing_fields = 0;
1597 if (
h->cur_pic_ptr->frame_num !=
h->poc.frame_num) {
1604 h->cur_pic_ptr =
NULL;
1610 h->cur_pic_ptr =
NULL;
1629 h->cur_pic_ptr->tf.owner[field] =
h->avctx;
1632 if (CONFIG_ERROR_RESILIENCE)
1639 memset(
h->slice_table +
i*
h->mb_stride, -1, (
h->mb_stride - (
i+1==
h->mb_height)) *
sizeof(*
h->slice_table));
1641 memset(
h->slice_table, -1,
1642 (
h->mb_height *
h->mb_stride - 1) *
sizeof(*
h->slice_table));
1646 h->ps.sps, &
h->poc,
h->picture_structure,
nal->ref_idc);
1656 if (
h->sei.recovery_point.recovery_frame_cnt >= 0) {
1657 const int sei_recovery_frame_cnt =
h->sei.recovery_point.recovery_frame_cnt;
1660 h->valid_recovery_point = 1;
1662 if (
h->recovery_frame < 0
1663 ||
av_zero_extend(
h->recovery_frame -
h->poc.frame_num,
h->ps.sps->log2_max_frame_num) > sei_recovery_frame_cnt) {
1664 h->recovery_frame =
av_zero_extend(
h->poc.frame_num + sei_recovery_frame_cnt,
h->ps.sps->log2_max_frame_num);
1666 if (!
h->valid_recovery_point)
1667 h->recovery_frame =
h->poc.frame_num;
1680 if (
h->recovery_frame ==
h->poc.frame_num &&
nal->ref_idc) {
1681 h->recovery_frame = -1;
1686 h->cur_pic_ptr->recovered |=
h->frame_recovered;
1713 unsigned int slice_type,
tmp,
i;
1714 int field_pic_flag, bottom_field_flag;
1715 int first_slice = sl ==
h->slice_ctx && !
h->current_slice;
1716 int picture_structure;
1724 if (slice_type > 9) {
1726 "slice type %d too large at %d\n",
1730 if (slice_type > 4) {
1751 if (!
h->ps.pps_list[sl->
pps_id]) {
1753 "non-existing PPS %u referenced\n",
1771 if (
sps->frame_mbs_only_flag) {
1775 av_log(
h->avctx,
AV_LOG_ERROR,
"This stream was generated by a broken encoder, invalid 8x8 inference\n");
1779 if (field_pic_flag) {
1799 if (idr_pic_id < 65536) {
1807 if (
sps->poc_type == 0) {
1810 if (
pps->pic_order_present == 1 && picture_structure ==
PICT_FRAME)
1815 if (
sps->poc_type == 1 && !
sps->delta_pic_order_always_zero_flag) {
1818 if (
pps->pic_order_present == 1 && picture_structure ==
PICT_FRAME)
1823 if (
pps->redundant_pic_cnt_present)
1831 picture_structure,
h->avctx);
1844 for (
i = 0;
i < 2;
i++) {
1849 (
pps->weighted_bipred_idc == 1 &&
1853 picture_structure,
h->avctx);
1876 if (
tmp > 51 + 6 * (
sps->bit_depth_luma - 8)) {
1893 if (
pps->deblocking_filter_parameters_present) {
1897 "deblocking_filter_idc %u out of range\n",
tmp);
1907 if (slice_alpha_c0_offset_div2 > 6 ||
1908 slice_alpha_c0_offset_div2 < -6 ||
1909 slice_beta_offset_div2 > 6 ||
1910 slice_beta_offset_div2 < -6) {
1912 "deblocking filter parameters %d %d out of range\n",
1913 slice_alpha_c0_offset_div2, slice_beta_offset_div2);
1953 if (
h->ps.pps->weighted_bipred_idc == 2 &&
1983 h->postpone_filter = 1;
1989 h->ps.pps->chroma_qp_index_offset[0],
1990 h->ps.pps->chroma_qp_index_offset[1]) +
1991 6 * (
h->ps.sps->bit_depth_luma - 8);
1994 if (
h->current_slice >= 0xFFFE) {
2010 for (j = 0; j < 2; j++) {
2013 for (
i = 0;
i < 16;
i++) {
2015 if (j < sl->list_count &&
i < sl->ref_count[j] &&
2019 for (k = 0; k <
h->short_ref_count; k++)
2020 if (
h->short_ref[k]->f->buf[0]->buffer == buf) {
2024 for (k = 0; k <
h->long_ref_count; k++)
2025 if (
h->long_ref[k] &&
h->long_ref[k]->f->buf[0]->buffer == buf) {
2026 id_list[
i] =
h->short_ref_count + k;
2034 for (
i = 0;
i < 16;
i++)
2037 ref2frm[18 + 1] = -1;
2038 for (
i = 16;
i < 48;
i++)
2039 ref2frm[
i + 4] = 4 * id_list[(
i - 16) >> 1] +
2044 h->cur_pic_ptr->gray = 0;
2053 h->cur_pic_ptr->gray = gray;
2058 "slice:%d %c mb:%d %c%s%s frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d:%d:%d weight:%d%s %s\n",
2066 h->cur_pic_ptr->field_poc[0],
2067 h->cur_pic_ptr->field_poc[1],
2083 int first_slice = sl ==
h->slice_ctx && !
h->current_slice;
2099 if (
h->setup_finished) {
2106 if (
h->current_slice) {
2109 if (
h->nb_slice_ctx_queued) {
2116 memcpy(&tmp_ctx,
h->slice_ctx,
sizeof(tmp_ctx));
2117 memcpy(
h->slice_ctx, sl,
sizeof(tmp_ctx));
2118 memcpy(sl, &tmp_ctx,
sizeof(tmp_ctx));
2131 h->cur_pic_ptr =
NULL;
2138 if (!
h->first_field) {
2139 if (
h->cur_pic_ptr && !
h->droppable) {
2143 h->cur_pic_ptr =
NULL;
2147 if (!
h->current_slice)
2150 if (
h->current_slice == 0 && !
h->first_field) {
2164 if (
h->ps.pps->sps_id !=
pps->sps_id ||
2165 h->ps.pps->transform_8x8_mode !=
pps->transform_8x8_mode
2170 if (
h->ps.sps !=
pps->sps) {
2172 "SPS changed in the middle of the frame\n");
2177 if (
h->current_slice == 0) {
2183 h->droppable != (
nal->ref_idc == 0)) {
2185 "Changing field mode (%d -> %d) between slices is not allowed\n",
2188 }
else if (!
h->cur_pic_ptr) {
2190 "unset cur_pic_ptr on slice %d\n",
2191 h->current_slice + 1);
2200 h->nb_slice_ctx_queued++;
2225 int mb_type,
int top_xy,
2229 int mb_xy,
int list)
2231 int b_stride =
h->b_stride;
2236 const int b_xy =
h->mb2b_xy[top_xy] + 3 * b_stride;
2237 const int b8_xy = 4 * top_xy + 2;
2238 const int *ref2frm = &
h->ref2frm[
h->slice_table[top_xy] & (
MAX_SLICES - 1)][list][(
MB_MBAFF(sl) ? 20 : 2)];
2239 AV_COPY128(mv_dst - 1 * 8,
h->cur_pic.motion_val[list][b_xy + 0]);
2240 ref_cache[0 - 1 * 8] =
2241 ref_cache[1 - 1 * 8] = ref2frm[
h->cur_pic.ref_index[list][b8_xy + 0]];
2242 ref_cache[2 - 1 * 8] =
2243 ref_cache[3 - 1 * 8] = ref2frm[
h->cur_pic.ref_index[list][b8_xy + 1]];
2251 const int b_xy =
h->mb2b_xy[left_xy[
LTOP]] + 3;
2252 const int b8_xy = 4 * left_xy[
LTOP] + 1;
2254 AV_COPY32(mv_dst - 1 + 0,
h->cur_pic.motion_val[list][b_xy + b_stride * 0]);
2255 AV_COPY32(mv_dst - 1 + 8,
h->cur_pic.motion_val[list][b_xy + b_stride * 1]);
2256 AV_COPY32(mv_dst - 1 + 16,
h->cur_pic.motion_val[list][b_xy + b_stride * 2]);
2257 AV_COPY32(mv_dst - 1 + 24,
h->cur_pic.motion_val[list][b_xy + b_stride * 3]);
2259 ref_cache[-1 + 8] = ref2frm[
h->cur_pic.ref_index[list][b8_xy + 2 * 0]];
2260 ref_cache[-1 + 16] =
2261 ref_cache[-1 + 24] = ref2frm[
h->cur_pic.ref_index[list][b8_xy + 2 * 1]];
2269 ref_cache[-1 + 16] =
2285 const int8_t *
ref = &
h->cur_pic.ref_index[list][4 * mb_xy];
2287 uint32_t ref01 = (
pack16to32(ref2frm[
ref[0]], ref2frm[
ref[1]]) & 0x00FF00FF) * 0x0101;
2288 uint32_t ref23 = (
pack16to32(ref2frm[
ref[2]], ref2frm[
ref[3]]) & 0x00FF00FF) * 0x0101;
2289 AV_WN32A(&ref_cache[0 * 8], ref01);
2290 AV_WN32A(&ref_cache[1 * 8], ref01);
2291 AV_WN32A(&ref_cache[2 * 8], ref23);
2292 AV_WN32A(&ref_cache[3 * 8], ref23);
2296 int16_t(*mv_src)[2] = &
h->cur_pic.motion_val[list][4 * sl->
mb_x + 4 * sl->
mb_y * b_stride];
2297 AV_COPY128(mv_dst + 8 * 0, mv_src + 0 * b_stride);
2298 AV_COPY128(mv_dst + 8 * 1, mv_src + 1 * b_stride);
2299 AV_COPY128(mv_dst + 8 * 2, mv_src + 2 * b_stride);
2300 AV_COPY128(mv_dst + 8 * 3, mv_src + 3 * b_stride);
2309 const int mb_xy = sl->
mb_xy;
2315 top_xy = mb_xy - (
h->mb_stride <<
MB_FIELD(sl));
2317 left_xy[
LBOT] = left_xy[
LTOP] = mb_xy - 1;
2319 const int left_mb_field_flag =
IS_INTERLACED(
h->cur_pic.mb_type[mb_xy - 1]);
2322 if (left_mb_field_flag != curr_mb_field_flag)
2323 left_xy[
LTOP] -=
h->mb_stride;
2325 if (curr_mb_field_flag)
2326 top_xy +=
h->mb_stride &
2327 (((
h->cur_pic.mb_type[top_xy] >> 7) & 1) - 1);
2328 if (left_mb_field_flag != curr_mb_field_flag)
2329 left_xy[
LBOT] +=
h->mb_stride;
2341 int qp =
h->cur_pic.qscale_table[mb_xy];
2342 if (qp <= qp_thresh &&
2343 (left_xy[
LTOP] < 0 ||
2344 ((qp +
h->cur_pic.qscale_table[left_xy[
LTOP]] + 1) >> 1) <= qp_thresh) &&
2346 ((qp +
h->cur_pic.qscale_table[top_xy] + 1) >> 1) <= qp_thresh)) {
2349 if ((left_xy[
LTOP] < 0 ||
2350 ((qp +
h->cur_pic.qscale_table[left_xy[
LBOT]] + 1) >> 1) <= qp_thresh) &&
2351 (top_xy < h->mb_stride ||
2352 ((qp +
h->cur_pic.qscale_table[top_xy -
h->mb_stride] + 1) >> 1) <= qp_thresh))
2357 top_type =
h->cur_pic.mb_type[top_xy];
2358 left_type[
LTOP] =
h->cur_pic.mb_type[left_xy[
LTOP]];
2359 left_type[
LBOT] =
h->cur_pic.mb_type[left_xy[
LBOT]];
2364 left_type[
LTOP] = left_type[
LBOT] = 0;
2366 if (
h->slice_table[top_xy] == 0xFFFF)
2368 if (
h->slice_table[left_xy[
LBOT]] == 0xFFFF)
2369 left_type[
LTOP] = left_type[
LBOT] = 0;
2379 top_type, left_type, mb_xy, 0);
2382 top_type, left_type, mb_xy, 1);
2384 nnz =
h->non_zero_count[mb_xy];
2386 AV_COPY32(&nnz_cache[4 + 8 * 1], &nnz[0]);
2387 AV_COPY32(&nnz_cache[4 + 8 * 2], &nnz[4]);
2388 AV_COPY32(&nnz_cache[4 + 8 * 3], &nnz[8]);
2389 AV_COPY32(&nnz_cache[4 + 8 * 4], &nnz[12]);
2390 sl->
cbp =
h->cbp_table[mb_xy];
2393 nnz =
h->non_zero_count[top_xy];
2394 AV_COPY32(&nnz_cache[4 + 8 * 0], &nnz[3 * 4]);
2397 if (left_type[
LTOP]) {
2398 nnz =
h->non_zero_count[left_xy[
LTOP]];
2399 nnz_cache[3 + 8 * 1] = nnz[3 + 0 * 4];
2400 nnz_cache[3 + 8 * 2] = nnz[3 + 1 * 4];
2401 nnz_cache[3 + 8 * 3] = nnz[3 + 2 * 4];
2402 nnz_cache[3 + 8 * 4] = nnz[3 + 3 * 4];
2407 if (!
CABAC(
h) &&
h->ps.pps->transform_8x8_mode) {
2409 nnz_cache[4 + 8 * 0] =
2410 nnz_cache[5 + 8 * 0] = (
h->cbp_table[top_xy] & 0x4000) >> 12;
2411 nnz_cache[6 + 8 * 0] =
2412 nnz_cache[7 + 8 * 0] = (
h->cbp_table[top_xy] & 0x8000) >> 12;
2415 nnz_cache[3 + 8 * 1] =
2416 nnz_cache[3 + 8 * 2] = (
h->cbp_table[left_xy[
LTOP]] & 0x2000) >> 12;
2419 nnz_cache[3 + 8 * 3] =
2420 nnz_cache[3 + 8 * 4] = (
h->cbp_table[left_xy[
LBOT]] & 0x8000) >> 12;
2424 nnz_cache[
scan8[0]] =
2425 nnz_cache[
scan8[1]] =
2426 nnz_cache[
scan8[2]] =
2427 nnz_cache[
scan8[3]] = (sl->
cbp & 0x1000) >> 12;
2429 nnz_cache[
scan8[0 + 4]] =
2430 nnz_cache[
scan8[1 + 4]] =
2431 nnz_cache[
scan8[2 + 4]] =
2432 nnz_cache[
scan8[3 + 4]] = (sl->
cbp & 0x2000) >> 12;
2434 nnz_cache[
scan8[0 + 8]] =
2435 nnz_cache[
scan8[1 + 8]] =
2436 nnz_cache[
scan8[2 + 8]] =
2437 nnz_cache[
scan8[3 + 8]] = (sl->
cbp & 0x4000) >> 12;
2439 nnz_cache[
scan8[0 + 12]] =
2440 nnz_cache[
scan8[1 + 12]] =
2441 nnz_cache[
scan8[2 + 12]] =
2442 nnz_cache[
scan8[3 + 12]] = (sl->
cbp & 0x8000) >> 12;
2451 uint8_t *dest_y, *dest_cb, *dest_cr;
2452 int linesize, uvlinesize, mb_x, mb_y;
2455 const int pixel_shift =
h->pixel_shift;
2456 const int block_h = 16 >>
h->chroma_y_shift;
2458 if (
h->postpone_filter)
2462 for (mb_x = start_x; mb_x < end_x; mb_x++)
2463 for (mb_y = end_mb_y -
FRAME_MBAFF(
h); mb_y <= end_mb_y; mb_y++) {
2465 mb_xy = sl->
mb_xy = mb_x + mb_y *
h->mb_stride;
2466 mb_type =
h->cur_pic.mb_type[mb_xy];
2474 dest_y =
h->cur_pic.f->data[0] +
2475 ((mb_x << pixel_shift) + mb_y * sl->
linesize) * 16;
2476 dest_cb =
h->cur_pic.f->data[1] +
2477 (mb_x << pixel_shift) * (8 <<
CHROMA444(
h)) +
2479 dest_cr =
h->cur_pic.f->data[2] +
2480 (mb_x << pixel_shift) * (8 <<
CHROMA444(
h)) +
2505 linesize, uvlinesize);
2508 dest_cr, linesize, uvlinesize);
2521 const int mb_xy = sl->
mb_x + sl->
mb_y *
h->mb_stride;
2522 int mb_type = (
h->slice_table[mb_xy - 1] == sl->
slice_num) ?
2523 h->cur_pic.mb_type[mb_xy - 1] :
2524 (
h->slice_table[mb_xy -
h->mb_stride] == sl->
slice_num) ?
2525 h->cur_pic.mb_type[mb_xy -
h->mb_stride] : 0;
2540 if ((top +
height) >= pic_height)
2541 height += deblock_border;
2542 top -= deblock_border;
2545 if (top >= pic_height || (top +
height) < 0)
2556 if (
h->droppable ||
h->er.error_occurred)
2564 int startx,
int starty,
2565 int endx,
int endy,
int status)
2570 if (CONFIG_ERROR_RESILIENCE) {
2579 int lf_x_start = sl->
mb_x;
2583 sl->
linesize =
h->cur_pic_ptr->f->linesize[0];
2594 if (
h->postpone_filter)
2604 prev_status &= ~ VP_START;
2610 if (
h->ps.pps->cabac) {
2654 if (sl->
mb_x >= lf_x_start)
2662 "error while decoding MB %d %d, bytestream %td\n",
2670 if (++sl->
mb_x >=
h->mb_width) {
2672 sl->
mb_x = lf_x_start = 0;
2682 if (eos || sl->
mb_y >=
h->mb_height) {
2683 ff_tlog(
h->avctx,
"slice end %d %d\n",
2687 if (sl->
mb_x > lf_x_start)
2721 "error while decoding MB %d %d\n", sl->
mb_x, sl->
mb_y);
2727 if (++sl->
mb_x >=
h->mb_width) {
2729 sl->
mb_x = lf_x_start = 0;
2737 if (sl->
mb_y >=
h->mb_height) {
2738 ff_tlog(
h->avctx,
"slice end %d %d\n",
2757 ff_tlog(
h->avctx,
"slice end %d %d\n",
2763 if (sl->
mb_x > lf_x_start)
2791 int context_count =
h->nb_slice_ctx_queued;
2795 h->slice_ctx[0].next_slice_idx = INT_MAX;
2797 if (
h->avctx->hwaccel || context_count < 1)
2800 av_assert0(context_count &&
h->slice_ctx[context_count - 1].mb_y <
h->mb_height);
2802 if (context_count == 1) {
2804 h->slice_ctx[0].next_slice_idx =
h->mb_width *
h->mb_height;
2805 h->postpone_filter = 0;
2808 h->mb_y =
h->slice_ctx[0].mb_y;
2813 for (
i = 0;
i < context_count;
i++) {
2814 int next_slice_idx =
h->mb_width *
h->mb_height;
2817 sl = &
h->slice_ctx[
i];
2820 slice_idx = sl->
mb_y *
h->mb_width + sl->
mb_x;
2821 for (j = 0; j < context_count; j++) {
2823 int slice_idx2 = sl2->
mb_y *
h->mb_width + sl2->
mb_x;
2825 if (
i == j || slice_idx2 < slice_idx)
2827 next_slice_idx =
FFMIN(next_slice_idx, slice_idx2);
2833 NULL, context_count,
sizeof(
h->slice_ctx[0]));
2836 sl = &
h->slice_ctx[context_count - 1];
2839 if (
h->postpone_filter) {
2840 h->postpone_filter = 0;
2842 for (
i = 0;
i < context_count;
i++) {
2845 sl = &
h->slice_ctx[
i];
2847 x_end = (sl->
mb_y >=
h->mb_height) ?
h->mb_width : sl->
mb_x;
2852 j == y_end - 1 ? x_end :
h->mb_width);
2859 h->nb_slice_ctx_queued = 0;
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
#define FF_DEBUG_PICT_INFO
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Context Adaptive Binary Arithmetic Coder.
Context Adaptive Binary Arithmetic Coder inline functions.
static av_unused int get_cabac_terminate(CABACContext *c)
#define i(width, name, range_min, range_max)
static int FUNC sps(CodedBitstreamContext *ctx, RWContext *rw, H264RawSPS *current)
static int FUNC nal(CodedBitstreamContext *ctx, RWContext *rw, LCEVCRawNAL *current, int nal_unit_type)
#define ss(width, name, subs,...)
#define AV_CEIL_RSHIFT(a, b)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef **buf)
Similar to ff_frame_new_side_data, but using an existing buffer ref.
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
Allocate a hwaccel frame private data if the provided avctx uses a hwaccel method that needs it.
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd)
Wrapper around av_frame_new_side_data, which rejects side data overridden by the demuxer.
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
Check that the provided sample aspect ratio is valid and set it on the codec context.
#define FF_COMPLIANCE_STRICT
Strictly conform to all the things in the spec no matter what consequences.
#define AV_EF_EXPLODE
abort decoding on minor error detection
#define AV_EF_AGGRESSIVE
consider things that a sane encoder/muxer should not do as an error
#define atomic_init(obj, value)
void ff_er_add_slice(ERContext *s, int startx, int starty, int endx, int endy, int status)
Add a slice.
void ff_er_frame_start(ERContext *s)
static void fill_rectangle(int x, int y, int w, int h)
static int decode_slice(AVCodecContext *c, void *arg)
static int get_bits_left(GetBitContext *gb)
static unsigned int get_bits1(GetBitContext *s)
static const uint8_t * align_get_bits(GetBitContext *s)
static int get_bits_count(const GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int get_se_golomb(GetBitContext *gb)
read signed exp golomb code.
static int get_ue_golomb_31(GetBitContext *gb)
read unsigned exp golomb code, constraint to a max of 31.
static int get_ue_golomb(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to 8190.
static unsigned get_ue_golomb_long(GetBitContext *gb)
Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
#define AV_CODEC_FLAG2_FAST
Allow non spec compliant speedup tricks.
#define AV_CODEC_FLAG2_SHOW_ALL
Show all frames before the first keyframe.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
#define AV_CODEC_EXPORT_DATA_FILM_GRAIN
Decoding only.
#define AV_CODEC_FLAG_OUTPUT_CORRUPT
Output even those frames that might be corrupted.
@ AVDISCARD_ALL
discard all
@ AVDISCARD_NONKEY
discard all frames except keyframes
@ AVDISCARD_BIDIR
discard all bidirectional frames
@ AVDISCARD_NONINTRA
discard all non intra frames
@ AVDISCARD_NONREF
discard all non reference
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
#define AV_FRAME_FLAG_CORRUPT
The frame data may be corrupted, e.g.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
@ AV_FRAME_DATA_LCEVC
Raw LCEVC payload data, as a uint8_t array, with NAL emulation bytes intact.
@ AV_FRAME_DATA_S12M_TIMECODE
Timecode which conforms to SMPTE ST 12-1.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
void av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size)
Allocate and clear a buffer, reusing the given one if large enough.
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
Overlapping memcpy() implementation.
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_SP
Switching Predicted.
@ AV_PICTURE_TYPE_P
Predicted.
@ AV_PICTURE_TYPE_SI
Switching Intra.
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
int ff_h2645_sei_to_frame(AVFrame *frame, H2645SEI *sei, enum AVCodecID codec_id, AVCodecContext *avctx, const H2645VUI *vui, unsigned bit_depth_luma, unsigned bit_depth_chroma, int seed)
int ff_h2645_sei_ctx_replace(H2645SEI *dst, const H2645SEI *src)
H.264 common definitions.
int ff_h264_decode_mb_cabac(const H264Context *h, H264SliceContext *sl)
Decode a macroblock.
void ff_h264_init_cabac_states(const H264Context *h, H264SliceContext *sl)
int ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl)
Decode a macroblock.
void ff_h264_direct_ref_list_init(const H264Context *const h, H264SliceContext *sl)
void ff_h264_direct_dist_scale_factor(const H264Context *const h, H264SliceContext *sl)
void ff_h264_filter_mb(const H264Context *h, H264SliceContext *sl, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize)
void ff_h264_filter_mb_fast(const H264Context *h, H264SliceContext *sl, int mb_x, int mb_y, uint8_t *img_y, uint8_t *img_cb, uint8_t *img_cr, unsigned int linesize, unsigned int uvlinesize)
void ff_h264_hl_decode_mb(const H264Context *h, H264SliceContext *sl)
int ff_h264_get_profile(const SPS *sps)
Compute profile from profile_idc and constraint_set?_flags.
int ff_h264_parse_ref_count(int *plist_count, int ref_count[2], GetBitContext *gb, const PPS *pps, int slice_type_nos, int picture_structure, void *logctx)
int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, const SPS *sps, H264POCContext *pc, int picture_structure, int nal_ref_idc)
int ff_h264_pred_weight_table(GetBitContext *gb, const SPS *sps, const int *ref_count, int slice_type_nos, H264PredWeightTable *pwt, int picture_structure, void *logctx)
static const uint8_t scan8[16 *3+3]
static av_always_inline uint32_t pack16to32(unsigned a, unsigned b)
void ff_h264_set_erpic(ERPicture *dst, const H264Picture *src)
void ff_h264_unref_picture(H264Picture *pic)
int ff_h264_ref_picture(H264Picture *dst, const H264Picture *src)
int ff_h264_field_end(H264Context *h, H264SliceContext *sl, int in_setup)
int ff_h264_replace_picture(H264Picture *dst, const H264Picture *src)
H.264 parameter set handling.
int ff_h264_decode_ref_pic_list_reordering(H264SliceContext *sl, void *logctx)
int ff_h264_decode_ref_pic_marking(H264SliceContext *sl, GetBitContext *gb, const H2645NAL *nal, void *logctx)
int ff_h264_execute_ref_pic_marking(H264Context *h)
Execute the reference picture marking (memory management control operations).
int ff_h264_build_ref_list(H264Context *h, H264SliceContext *sl)
int ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps, void *logctx)
Parse the contents of a picture timing message given an active SPS.
@ H264_SEI_PIC_STRUCT_BOTTOM_FIELD
2: bottom field
@ H264_SEI_PIC_STRUCT_BOTTOM_TOP
4: bottom field, top field, in that order
@ H264_SEI_PIC_STRUCT_TOP_BOTTOM_TOP
5: top field, bottom field, top field repeated, in that order
@ H264_SEI_PIC_STRUCT_TOP_FIELD
1: top field
@ H264_SEI_PIC_STRUCT_FRAME_TRIPLING
8: frame tripling
@ H264_SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM
6: bottom field, top field, bottom field repeated, in that order
@ H264_SEI_PIC_STRUCT_TOP_BOTTOM
3: top field, bottom field, in that order
@ H264_SEI_PIC_STRUCT_FRAME_DOUBLING
7: frame doubling
@ H264_SEI_PIC_STRUCT_FRAME
0: frame
static int find_unused_picture(const H264Context *h)
static av_always_inline void backup_mb_border(const H264Context *h, H264SliceContext *sl, const uint8_t *src_y, const uint8_t *src_cb, const uint8_t *src_cr, int linesize, int uvlinesize, int simple)
static int h264_frame_start(H264Context *h)
static void init_dimensions(H264Context *h)
int ff_h264_update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
static void init_scan_tables(H264Context *h)
initialize scan tables
static int fill_filter_caches(const H264Context *h, H264SliceContext *sl, int mb_type)
static int h264_slice_init(H264Context *h, H264SliceContext *sl, const H2645NAL *nal)
static void implicit_weight_table(const H264Context *h, H264SliceContext *sl, int field)
Initialize implicit_weight table.
static void er_add_slice(H264SliceContext *sl, int startx, int starty, int endx, int endy, int status)
int ff_h264_execute_decode_slices(H264Context *h)
Call decode_slice() for each context.
static void predict_field_decoding_flag(const H264Context *h, H264SliceContext *sl)
static int h264_field_start(H264Context *h, const H264SliceContext *sl, const H2645NAL *nal, int first_slice)
int ff_h264_queue_decode_slice(H264Context *h, const H2645NAL *nal)
Submit a slice for decoding.
#define REBASE_PICTURE(pic, new_ctx, old_ctx)
static void copy_picture_range(H264Picture **to, H264Picture *const *from, int count, H264Context *new_base, const H264Context *old_base)
static const uint8_t field_scan[16+1]
static void loop_filter(const H264Context *h, H264SliceContext *sl, int start_x, int end_x)
#define IN_RANGE(a, b, size)
static int alloc_scratch_buffers(H264SliceContext *sl, int linesize)
static int h264_slice_header_parse(const H264Context *h, H264SliceContext *sl, const H2645NAL *nal)
static av_always_inline void fill_filter_caches_inter(const H264Context *h, H264SliceContext *sl, int mb_type, int top_xy, const int left_xy[LEFT_MBS], int top_type, const int left_type[LEFT_MBS], int mb_xy, int list)
static void color_frame(AVFrame *frame, const int c[4])
static const uint8_t field_scan8x8[64+1]
static int h264_export_frame_props(H264Context *h)
static int alloc_picture(H264Context *h, H264Picture *pic)
static const uint8_t field_scan8x8_cavlc[64+1]
static void release_unused_pictures(H264Context *h, int remove_current)
static int h264_slice_header_init(H264Context *h)
static int h264_init_ps(H264Context *h, const H264SliceContext *sl, int first_slice)
int ff_h264_update_thread_context_for_user(AVCodecContext *dst, const AVCodecContext *src)
static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
static int decode_slice(struct AVCodecContext *avctx, void *arg)
int ff_h264_get_slice_type(const H264SliceContext *sl)
Reconstruct bitstream slice_type.
static int init_table_pools(H264Context *h)
static void decode_finish_row(const H264Context *h, H264SliceContext *sl)
Draw edges and report progress for the last MB row.
static enum AVPixelFormat non_j_pixfmt(enum AVPixelFormat a)
static int h264_select_output_frame(H264Context *h)
static const uint8_t zigzag_scan8x8_cavlc[64+1]
const uint8_t ff_h264_golomb_to_pict_type[5]
H.264 / AVC / MPEG-4 part10 codec.
#define FIELD_OR_MBAFF_PICTURE(h)
#define FRAME_RECOVERED_IDR
We have seen an IDR, so all the following frames in coded order are correctly decodable.
#define H264_MAX_PICTURE_COUNT
static av_always_inline int get_chroma_qp(const PPS *pps, int t, int qscale)
Get the chroma qp.
#define FRAME_RECOVERED_SEI
Sufficient number of frames have been decoded since a SEI recovery point, so all the following frames...
#define USES_LIST(a, list)
#define DELAYED_PIC_REF
Value of Picture.reference when Picture is not a reference picture, but is held for delayed output.
av_cold void ff_h264chroma_init(H264ChromaContext *c, int bit_depth)
int ff_h264_alloc_tables(H264Context *h)
Allocate tables.
void ff_h264_free_tables(H264Context *h)
void ff_h264_draw_horiz_band(const H264Context *h, H264SliceContext *sl, int y, int height)
void ff_h264_slice_context_init(H264Context *h, H264SliceContext *sl)
Init slice context.
void ff_h264_flush_change(H264Context *h)
av_cold void ff_h264dsp_init(H264DSPContext *c, const int bit_depth, const int chroma_format_idc)
av_cold void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth, int chroma_format_idc)
Set the intra prediction function pointers.
av_cold void ff_h264qpel_init(H264QpelContext *c, int bit_depth)
Multithreading API for decoders.
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
static enum AVPixelFormat pix_fmts[]
const uint8_t ff_zigzag_direct[64]
const uint8_t ff_zigzag_scan[16+1]
Memory handling functions.
#define PICT_BOTTOM_FIELD
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_PLANAR
At least one pixel component is not in the first data plane.
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV422P9
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_JPEG
Full range content.
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P14
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
@ AV_PIX_FMT_VIDEOTOOLBOX
hardware decoding through Videotoolbox
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
@ AV_PIX_FMT_CUARRAY
hardware decoding through openharmony
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
#define AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P10
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
void ff_thread_release_ext_buffer(ThreadFrame *f)
Unref a ThreadFrame.
int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around ff_get_buffer() for frame-multithreaded codecs.
int ff_thread_can_start_frame(AVCodecContext *avctx)
void ff_thread_await_progress(const ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
useful rectangle filling function
AVRefStructPool * av_refstruct_pool_alloc(size_t size, unsigned flags)
Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
const void * av_refstruct_ref_c(const void *obj)
Analog of av_refstruct_ref(), but for constant objects.
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
#define FF_ARRAY_ELEMS(a)
A reference counted buffer type.
main external API structure.
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
Structure to hold side data for an AVFrame.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
enum AVPictureType pict_type
Picture type of the frame.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
const uint8_t * bytestream_end
const uint8_t * bytestream
uint8_t * error_status_table
H264Picture DPB[H264_MAX_PICTURE_COUNT]
int is_avc
Used to parse AVC variant of H.264.
int nal_length_size
Number of bytes used for nal length (1, 2 or 4)
atomic_int * decode_error_flags
RefStruct reference; its pointee is shared between decoding threads.
int recovered
picture at IDR or recovery point + recovery count
int16_t(*[2] motion_val)[2]
int8_t * ref_index[2]
RefStruct reference.
int sei_recovery_frame_cnt
int field_picture
whether or not picture was encoded in separate fields
int frame_num
frame_num (raw frame_num from slice header)
int long_ref
1->long term reference 0->short term reference
void * hwaccel_picture_private
RefStruct reference for hardware accelerator private data.
int mmco_reset
MMCO_RESET set this 1.
int field_poc[2]
top/bottom POC
int8_t * qscale_table_base
RefStruct reference.
int16_t(*[2] motion_val_base)[2]
RefStruct reference.
uint32_t * mb_type_base
RefStruct reference.
int needs_fg
whether picture needs film grain synthesis (see f_grain)
int chroma_log2_weight_denom
int luma_log2_weight_denom
int implicit_weight[48][48][2]
int chroma_weight_flag[2]
7.4.3.2 chroma_weight_lX_flag
int luma_weight_flag[2]
7.4.3.2 luma_weight_lX_flag
const H264Picture * parent
ptrdiff_t mb_linesize
may be equal to s->linesize or s->linesize * 2, for mbaff
int mb_field_decoding_flag
int8_t ref_cache[2][5 *8]
unsigned int first_mb_addr
int bipred_scratchpad_allocated
int16_t mv_cache[2][5 *8][2]
Motion vector cache.
uint8_t * edge_emu_buffer
int deblocking_filter
disable_deblocking_filter_idc with 1 <-> 0
int top_borders_allocated[2]
uint8_t * bipred_scratchpad
int qp_thresh
QP threshold to skip loopfilter.
int slice_type_nos
S free slice type (SI/SP are remapped to I/P)
uint8_t(*[2] top_borders)[(16 *3) *2]
H264Ref ref_list[2][48]
0..15: frame refs, 16..47: mbaff field refs.
int direct_spatial_mv_pred
int mb_mbaff
mb_aff_frame && mb_field_decoding_flag
uint8_t(*[2] mvd_table)[2]
int8_t * intra4x4_pred_mode
const struct H264Context * h264
int edge_emu_buffer_allocated
int slice_alpha_c0_offset
uint8_t non_zero_count_cache[15 *8]
non zero coeff count cache.
unsigned int ref_count[2]
num_ref_idx_l0/1_active_minus1 + 1
MMCO mmco[H264_MAX_MMCO_COUNT]
#define avpriv_request_sample(...)
static int ref[MAX_W *MAX_W]
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
uint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff)
Convert sei info to SMPTE 12M binary representation.
char * av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field)
Get the timecode string from the SMPTE timecode format.
#define AV_TIMECODE_STR_SIZE
static double cr(void *priv, double x, double y)
static double cb(void *priv, double x, double y)