Go to the documentation of this file.
43 #define DNX10BIT_QMAT_SHIFT 18
44 #define RC_VARIANCE 1 // use variance or ssd for fast rc
45 #define LAMBDA_FRAC_BITS 10
47 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
49 {
"nitris_compat",
"encode with Avid Nitris compatibility",
51 {
"ibias",
"intra quant bias",
53 { .i64 = 0 }, INT_MIN, INT_MAX,
VE },
58 0, 0,
VE,
"profile" },
60 0, 0,
VE,
"profile" },
62 0, 0,
VE,
"profile" },
64 0, 0,
VE,
"profile" },
66 0, 0,
VE,
"profile" },
68 0, 0,
VE,
"profile" },
80 const uint8_t *pixels,
84 for (
i = 0;
i < 4;
i++) {
104 const uint8_t *pixels,
107 memcpy(
block + 0 * 8, pixels + 0 * line_size, 8 *
sizeof(*
block));
108 memcpy(
block + 7 * 8, pixels + 0 * line_size, 8 *
sizeof(*
block));
109 memcpy(
block + 1 * 8, pixels + 1 * line_size, 8 *
sizeof(*
block));
110 memcpy(
block + 6 * 8, pixels + 1 * line_size, 8 *
sizeof(*
block));
111 memcpy(
block + 2 * 8, pixels + 2 * line_size, 8 *
sizeof(*
block));
112 memcpy(
block + 5 * 8, pixels + 2 * line_size, 8 *
sizeof(*
block));
113 memcpy(
block + 3 * 8, pixels + 3 * line_size, 8 *
sizeof(*
block));
114 memcpy(
block + 4 * 8, pixels + 3 * line_size, 8 *
sizeof(*
block));
120 int i, j,
level, last_non_zero, start_i;
122 const uint8_t *
scantable=
ctx->intra_scantable.scantable;
125 unsigned int threshold1, threshold2;
132 qmat = n < 4 ?
ctx->q_intra_matrix[qscale] :
ctx->q_chroma_intra_matrix[qscale];
133 bias=
ctx->intra_quant_bias * (1 << (16 - 8));
134 threshold1 = (1 << 16) - bias - 1;
135 threshold2 = (threshold1 << 1);
137 for (
i = 63;
i >= start_i;
i--) {
141 if (((
unsigned)(
level + threshold1)) > threshold2) {
149 for (
i = start_i;
i <= last_non_zero;
i++) {
153 if (((
unsigned)(
level + threshold1)) > threshold2) {
173 return last_non_zero;
179 const uint8_t *
scantable=
ctx->intra_scantable.scantable;
180 const int *qmat = n<4 ?
ctx->q_intra_matrix[qscale] :
ctx->q_chroma_intra_matrix[qscale];
181 int last_non_zero = 0;
189 for (
i = 1;
i < 64; ++
i) {
204 return last_non_zero;
210 int max_level = 1 << (
ctx->bit_depth + 2);
217 ctx->vlc_codes =
ctx->orig_vlc_codes + max_level * 2;
218 ctx->vlc_bits =
ctx->orig_vlc_bits + max_level * 2;
226 offset = (alevel - 1) >> 6;
229 for (j = 0; j < 257; j++) {
230 if (
ctx->cid_table->ac_info[2*j+0] >> 1 == alevel &&
232 (!
run || (
ctx->cid_table->ac_info[2*j+1] & 2) &&
run)) {
236 (
ctx->cid_table->ac_codes[j] << 1) | (sign & 1);
237 ctx->vlc_bits[
index] =
ctx->cid_table->ac_bits[j] + 1;
239 ctx->vlc_codes[
index] =
ctx->cid_table->ac_codes[j];
249 ctx->vlc_bits[
index] +=
ctx->cid_table->index_bits;
253 for (
i = 0;
i < 62;
i++) {
254 int run =
ctx->cid_table->run[
i];
256 ctx->run_codes[
run] =
ctx->cid_table->run_codes[
i];
257 ctx->run_bits[
run] =
ctx->cid_table->run_bits[
i];
265 uint16_t weight_matrix[64] = { 1, };
267 const uint8_t *luma_weight_table =
ctx->cid_table->luma_weight;
268 const uint8_t *chroma_weight_table =
ctx->cid_table->chroma_weight;
276 if (
ctx->bit_depth == 8) {
277 for (
i = 1;
i < 64;
i++) {
279 weight_matrix[j] =
ctx->cid_table->luma_weight[
i];
282 weight_matrix,
ctx->intra_quant_bias, 1,
283 ctx->m.avctx->qmax, 1);
284 for (
i = 1;
i < 64;
i++) {
286 weight_matrix[j] =
ctx->cid_table->chroma_weight[
i];
289 weight_matrix,
ctx->intra_quant_bias, 1,
290 ctx->m.avctx->qmax, 1);
292 for (qscale = 1; qscale <=
ctx->m.avctx->qmax; qscale++) {
293 for (
i = 0;
i < 64;
i++) {
294 ctx->qmatrix_l[qscale][
i] <<= 2;
295 ctx->qmatrix_c[qscale][
i] <<= 2;
296 ctx->qmatrix_l16[qscale][0][
i] <<= 2;
297 ctx->qmatrix_l16[qscale][1][
i] <<= 2;
298 ctx->qmatrix_c16[qscale][0][
i] <<= 2;
299 ctx->qmatrix_c16[qscale][1][
i] <<= 2;
304 for (qscale = 1; qscale <=
ctx->m.avctx->qmax; qscale++) {
305 for (
i = 1;
i < 64;
i++) {
320 (qscale * luma_weight_table[
i]);
322 (qscale * chroma_weight_table[
i]);
327 ctx->m.q_chroma_intra_matrix16 =
ctx->qmatrix_c16;
328 ctx->m.q_chroma_intra_matrix =
ctx->qmatrix_c;
329 ctx->m.q_intra_matrix16 =
ctx->qmatrix_l16;
330 ctx->m.q_intra_matrix =
ctx->qmatrix_l;
345 ctx->frame_bits = (
ctx->coding_unit_size -
346 ctx->data_offset - 4 -
ctx->min_padding) * 8;
373 "pixel format is incompatible with DNxHD profile\n");
379 "pixel format is incompatible with DNxHR HQX profile\n");
387 "pixel format is incompatible with DNxHR LB/SQ/HQ profile\n");
396 "video parameters incompatible with DNxHD. Valid DNxHD profiles:\n");
402 if (
ctx->cid >= 1270 &&
ctx->cid <= 1274)
407 "Input dimensions too small, input must be at least 256x120\n");
430 if (!
ctx->m.dct_quantize)
436 ctx->block_width_l2 = 4;
437 }
else if (
ctx->bit_depth == 10) {
440 ctx->block_width_l2 = 4;
443 ctx->block_width_l2 = 3;
454 ctx->m.mb_height /= 2;
459 "Interlaced encoding is not supported for DNxHR profiles.\n");
463 ctx->m.mb_num =
ctx->m.mb_height *
ctx->m.mb_width;
469 ctx->coding_unit_size =
ctx->frame_size;
471 ctx->frame_size =
ctx->cid_table->frame_size;
472 ctx->coding_unit_size =
ctx->cid_table->coding_unit_size;
475 if (
ctx->m.mb_height > 68)
476 ctx->data_offset = 0x170 + (
ctx->m.mb_height << 2);
478 ctx->data_offset = 0x280;
486 if (
ctx->nitris_compat)
487 ctx->min_padding = 1600;
528 memset(
buf, 0,
ctx->data_offset);
532 if (
ctx->cid >= 1270 &&
ctx->cid <= 1274)
537 buf[5] =
ctx->interlaced ?
ctx->cur_field + 2 : 0x01;
544 buf[0x21] =
ctx->bit_depth == 10 ? 0x58 : 0x38;
545 buf[0x22] = 0x88 + (
ctx->interlaced << 2);
570 (
ctx->cid_table->dc_codes[nbits] << nbits) +
576 int last_index,
int n)
578 int last_non_zero = 0;
584 for (
i = 1;
i <= last_index;
i++) {
585 j =
ctx->m.intra_scantable.permutated[
i];
588 int run_level =
i - last_non_zero - 1;
589 int rlevel = slevel * (1 << 1) | !!run_level;
593 ctx->run_codes[run_level]);
602 int qscale,
int last_index)
604 const uint8_t *weight_matrix;
609 weight_matrix = ((n % 6) < 2) ?
ctx->cid_table->luma_weight
610 :
ctx->cid_table->chroma_weight;
612 weight_matrix = (n & 2) ?
ctx->cid_table->chroma_weight
613 :
ctx->cid_table->luma_weight;
616 for (
i = 1;
i <= last_index;
i++) {
617 int j =
ctx->m.intra_scantable.permutated[
i];
621 level = (1 - 2 *
level) * qscale * weight_matrix[
i];
622 if (
ctx->bit_depth == 10) {
623 if (weight_matrix[
i] != 8)
627 if (weight_matrix[
i] != 32)
633 level = (2 *
level + 1) * qscale * weight_matrix[
i];
634 if (
ctx->bit_depth == 10) {
635 if (weight_matrix[
i] != 8)
639 if (weight_matrix[
i] != 32)
653 for (
i = 0;
i < 64;
i++)
661 int last_non_zero = 0;
664 for (
i = 1;
i <= last_index;
i++) {
665 j =
ctx->m.intra_scantable.permutated[
i];
668 int run_level =
i - last_non_zero - 1;
670 !!run_level] +
ctx->run_bits[run_level];
680 const int bs =
ctx->block_width_l2;
681 const int bw = 1 << bs;
682 int dct_y_offset =
ctx->dct_y_offset;
683 int dct_uv_offset =
ctx->dct_uv_offset;
684 int linesize =
ctx->m.linesize;
685 int uvlinesize =
ctx->m.uvlinesize;
686 const uint8_t *ptr_y =
ctx->thread[0]->src[0] +
687 ((mb_y << 4) *
ctx->m.linesize) + (mb_x << bs + 1);
688 const uint8_t *ptr_u =
ctx->thread[0]->src[1] +
689 ((mb_y << 4) *
ctx->m.uvlinesize) + (mb_x << bs +
ctx->is_444);
690 const uint8_t *ptr_v =
ctx->thread[0]->src[2] +
691 ((mb_y << 4) *
ctx->m.uvlinesize) + (mb_x << bs +
ctx->is_444);
696 (mb_y << 4) + 16 >
ctx->m.avctx->height)) {
697 int y_w =
ctx->m.avctx->width - (mb_x << 4);
698 int y_h =
ctx->m.avctx->height - (mb_y << 4);
699 int uv_w = (y_w + 1) / 2;
705 linesize,
ctx->m.linesize,
709 uvlinesize,
ctx->m.uvlinesize,
713 uvlinesize,
ctx->m.uvlinesize,
717 dct_y_offset = bw * linesize;
718 dct_uv_offset = bw * uvlinesize;
719 ptr_y = &
ctx->edge_buf_y[0];
720 ptr_u = &
ctx->edge_buf_uv[0][0];
721 ptr_v = &
ctx->edge_buf_uv[1][0];
723 (mb_y << 4) + 16 >
ctx->m.avctx->height)) {
724 int y_w =
ctx->m.avctx->width - (mb_x << 4);
725 int y_h =
ctx->m.avctx->height - (mb_y << 4);
726 int uv_w =
ctx->is_444 ? y_w : (y_w + 1) / 2;
729 uvlinesize = 16 + 16 *
ctx->is_444;
732 linesize,
ctx->m.linesize,
736 uvlinesize,
ctx->m.uvlinesize,
740 uvlinesize,
ctx->m.uvlinesize,
744 dct_y_offset = bw * linesize / 2;
745 dct_uv_offset = bw * uvlinesize / 2;
746 ptr_y = &
ctx->edge_buf_y[0];
747 ptr_u = &
ctx->edge_buf_uv[0][0];
748 ptr_v = &
ctx->edge_buf_uv[1][0];
757 if (mb_y + 1 ==
ctx->m.mb_height &&
ctx->m.avctx->height == 1080) {
758 if (
ctx->interlaced) {
759 ctx->get_pixels_8x4_sym(
ctx->blocks[4],
760 ptr_y + dct_y_offset,
762 ctx->get_pixels_8x4_sym(
ctx->blocks[5],
763 ptr_y + dct_y_offset + bw,
765 ctx->get_pixels_8x4_sym(
ctx->blocks[6],
766 ptr_u + dct_uv_offset,
768 ctx->get_pixels_8x4_sym(
ctx->blocks[7],
769 ptr_v + dct_uv_offset,
772 ctx->bdsp.clear_block(
ctx->blocks[4]);
773 ctx->bdsp.clear_block(
ctx->blocks[5]);
774 ctx->bdsp.clear_block(
ctx->blocks[6]);
775 ctx->bdsp.clear_block(
ctx->blocks[7]);
779 ptr_y + dct_y_offset, linesize);
781 ptr_y + dct_y_offset + bw, linesize);
783 ptr_u + dct_uv_offset, uvlinesize);
785 ptr_v + dct_uv_offset, uvlinesize);
790 pdsp->
get_pixels(
ctx->blocks[6], ptr_y + dct_y_offset, linesize);
791 pdsp->
get_pixels(
ctx->blocks[7], ptr_y + dct_y_offset + bw, linesize);
795 pdsp->
get_pixels(
ctx->blocks[8], ptr_u + dct_uv_offset, uvlinesize);
796 pdsp->
get_pixels(
ctx->blocks[9], ptr_u + dct_uv_offset + bw, uvlinesize);
800 pdsp->
get_pixels(
ctx->blocks[10], ptr_v + dct_uv_offset, uvlinesize);
801 pdsp->
get_pixels(
ctx->blocks[11], ptr_v + dct_uv_offset + bw, uvlinesize);
813 const static uint8_t component[8]={0,0,1,2,0,0,1,2};
820 int jobnr,
int threadnr)
823 int mb_y = jobnr, mb_x;
824 int qscale =
ctx->qscale;
826 ctx =
ctx->thread[threadnr];
830 ctx->m.last_dc[2] = 1 << (
ctx->bit_depth + 2);
832 for (mb_x = 0; mb_x <
ctx->m.mb_width; mb_x++) {
833 unsigned mb = mb_y *
ctx->m.mb_width + mb_x;
841 for (
i = 0;
i < 8 + 4 *
ctx->is_444;
i++) {
842 int16_t *src_block =
ctx->blocks[
i];
846 memcpy(
block, src_block, 64 *
sizeof(*
block));
848 ctx->is_444 ? 4 * (n > 0): 4 & (2*
i),
859 dc_bits +=
ctx->cid_table->dc_bits[nbits] + nbits;
869 ctx->mb_rc[(qscale *
ctx->m.mb_num) +
mb].ssd = ssd;
870 ctx->mb_rc[(qscale *
ctx->m.mb_num) +
mb].
bits = ac_bits + dc_bits + 12 +
871 (1 +
ctx->is_444) * 8 *
ctx->vlc_bits[0];
877 int jobnr,
int threadnr)
880 int mb_y = jobnr, mb_x;
881 ctx =
ctx->thread[threadnr];
883 ctx->slice_size[jobnr]);
887 ctx->m.last_dc[2] = 1 << (
ctx->bit_depth + 2);
888 for (mb_x = 0; mb_x <
ctx->m.mb_width; mb_x++) {
889 unsigned mb = mb_y *
ctx->m.mb_width + mb_x;
890 int qscale =
ctx->mb_qscale[
mb];
898 for (
i = 0;
i < 8 + 4 *
ctx->is_444;
i++) {
901 int last_index =
ctx->m.dct_quantize(&
ctx->m,
block,
902 ctx->is_444 ? (((
i >> 1) % 3) < 1 ? 0 : 4): 4 & (2*
i),
918 for (mb_y = 0; mb_y <
ctx->m.mb_height; mb_y++) {
921 ctx->slice_size[mb_y] = 0;
922 for (mb_x = 0; mb_x <
ctx->m.mb_width; mb_x++) {
923 unsigned mb = mb_y *
ctx->m.mb_width + mb_x;
924 ctx->slice_size[mb_y] +=
ctx->mb_bits[
mb];
926 ctx->slice_size[mb_y] = (
ctx->slice_size[mb_y] + 31) & ~31;
927 ctx->slice_size[mb_y] >>= 3;
928 thread_size =
ctx->slice_size[mb_y];
934 int jobnr,
int threadnr)
937 int mb_y = jobnr, mb_x, x, y;
938 int partial_last_row = (mb_y ==
ctx->m.mb_height - 1) &&
941 ctx =
ctx->thread[threadnr];
942 if (
ctx->bit_depth == 8) {
943 uint8_t *pix =
ctx->thread[0]->src[0] + ((mb_y << 4) *
ctx->m.linesize);
944 for (mb_x = 0; mb_x <
ctx->m.mb_width; ++mb_x, pix += 16) {
945 unsigned mb = mb_y *
ctx->m.mb_width + mb_x;
950 sum =
ctx->m.mpvencdsp.pix_sum(pix,
ctx->m.linesize);
951 varc =
ctx->m.mpvencdsp.pix_norm1(pix,
ctx->m.linesize);
956 for (y = 0; y < bh; y++) {
957 for (x = 0; x < bw; x++) {
958 uint8_t
val = pix[x + y *
ctx->m.linesize];
964 varc = (varc - (((unsigned) sum * sum) >> 8) + 128) >> 8;
966 ctx->mb_cmp[
mb].value = varc;
970 const int linesize =
ctx->m.linesize >> 1;
971 for (mb_x = 0; mb_x <
ctx->m.mb_width; ++mb_x) {
972 uint16_t *pix = (uint16_t *)
ctx->thread[0]->src[0] +
973 ((mb_y << 4) * linesize) + (mb_x << 4);
974 unsigned mb = mb_y *
ctx->m.mb_width + mb_x;
982 for (
i = 0;
i < bh; ++
i) {
983 for (j = 0; j < bw; ++j) {
985 const int sample = (unsigned) pix[j] >> 6;
1003 int lambda, up_step, down_step;
1004 int last_lower = INT_MAX, last_higher = 0;
1013 lambda =
ctx->lambda;
1018 if (lambda == last_higher) {
1022 for (y = 0; y <
ctx->m.mb_height; y++) {
1023 for (x = 0; x <
ctx->m.mb_width; x++) {
1024 unsigned min = UINT_MAX;
1026 int mb = y *
ctx->m.mb_width + x;
1029 int i = (q*
ctx->m.mb_num) +
mb;
1030 unsigned score =
ctx->mb_rc[
i].bits * lambda +
1039 ctx->mb_qscale[
mb] = qscale;
1040 ctx->mb_bits[
mb] =
ctx->mb_rc[rc].bits;
1051 if (bits < ctx->frame_bits) {
1052 last_lower =
FFMIN(lambda, last_lower);
1053 if (last_higher != 0)
1054 lambda = (lambda+last_higher)>>1;
1056 lambda -= down_step;
1057 down_step =
FFMIN((int64_t)down_step*5, INT_MAX);
1059 lambda =
FFMAX(1, lambda);
1060 if (lambda == last_lower)
1063 last_higher =
FFMAX(lambda, last_higher);
1064 if (last_lower != INT_MAX)
1065 lambda = (lambda+last_lower)>>1;
1066 else if ((int64_t)lambda + up_step > INT_MAX)
1070 up_step =
FFMIN((int64_t)up_step*5, INT_MAX);
1074 ctx->lambda = lambda;
1083 int last_higher = 0;
1084 int last_lower = INT_MAX;
1088 qscale =
ctx->qscale;
1091 ctx->qscale = qscale;
1095 for (y = 0; y <
ctx->m.mb_height; y++) {
1096 for (x = 0; x <
ctx->m.mb_width; x++)
1102 if (bits < ctx->frame_bits) {
1105 if (last_higher == qscale - 1) {
1106 qscale = last_higher;
1109 last_lower =
FFMIN(qscale, last_lower);
1110 if (last_higher != 0)
1111 qscale = (qscale + last_higher) >> 1;
1113 qscale -= down_step++;
1118 if (last_lower == qscale + 1)
1120 last_higher =
FFMAX(qscale, last_higher);
1121 if (last_lower != INT_MAX)
1122 qscale = (qscale + last_lower) >> 1;
1124 qscale += up_step++;
1126 if (qscale >=
ctx->m.avctx->qmax)
1130 ctx->qscale = qscale;
1134 #define BUCKET_BITS 8
1135 #define RADIX_PASSES 4
1136 #define NBUCKETS (1 << BUCKET_BITS)
1151 int v =
data[
i].value;
1161 buckets[j][
i] =
offset -= buckets[j][
i];
1173 int pos = buckets[v]++;
1196 for (y = 0; y <
ctx->m.mb_height; y++) {
1197 for (x = 0; x <
ctx->m.mb_width; x++) {
1198 int mb = y *
ctx->m.mb_width + x;
1199 int rc = (
ctx->qscale *
ctx->m.mb_num ) +
mb;
1202 ctx->mb_bits[
mb] =
ctx->mb_rc[rc].bits;
1203 max_bits +=
ctx->mb_rc[rc].bits;
1205 delta_bits =
ctx->mb_rc[rc].bits -
1206 ctx->mb_rc[rc +
ctx->m.mb_num].bits;
1208 ctx->mb_cmp[
mb].value =
1209 delta_bits ? ((
ctx->mb_rc[rc].ssd -
1210 ctx->mb_rc[rc +
ctx->m.mb_num].ssd) * 100) /
1222 for (x = 0; x <
ctx->m.mb_num && max_bits >
ctx->frame_bits; x++) {
1223 int mb =
ctx->mb_cmp[x].mb;
1224 int rc = (
ctx->qscale *
ctx->m.mb_num ) +
mb;
1225 max_bits -=
ctx->mb_rc[rc].bits -
1226 ctx->mb_rc[rc +
ctx->m.mb_num].bits;
1227 ctx->mb_qscale[
mb] =
ctx->qscale + 1;
1228 ctx->mb_bits[
mb] =
ctx->mb_rc[rc +
ctx->m.mb_num].bits;
1238 for (
i = 0;
i <
ctx->m.avctx->thread_count;
i++) {
1239 ctx->thread[
i]->m.linesize =
frame->linesize[0] <<
ctx->interlaced;
1240 ctx->thread[
i]->m.uvlinesize =
frame->linesize[1] <<
ctx->interlaced;
1241 ctx->thread[
i]->dct_y_offset =
ctx->m.linesize *8;
1242 ctx->thread[
i]->dct_uv_offset =
ctx->m.uvlinesize*8;
1245 ctx->cur_field =
frame->interlaced_frame && !
frame->top_field_first;
1263 for (
i = 0;
i < 3;
i++) {
1265 if (
ctx->interlaced &&
ctx->cur_field)
1277 "picture could not fit ratecontrol constraints, increase qmax\n");
1284 for (
i = 0;
i <
ctx->m.mb_height;
i++) {
1294 ctx->coding_unit_size - 4 -
offset -
ctx->data_offset);
1300 ctx->cur_field ^= 1;
1301 buf +=
ctx->coding_unit_size;
1302 goto encode_coding_unit;
1334 if (
ctx->thread[1]) {
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
static const AVOption options[]
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
AVPixelFormat
Pixel format.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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 all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static av_always_inline void dnxhd_encode_block(DNXHDEncContext *ctx, int16_t *block, int last_index, int n)
static av_cold int dnxhd_init_rc(DNXHDEncContext *ctx)
static av_always_inline int dnxhd_calc_ac_bits(DNXHDEncContext *ctx, int16_t *block, int last_index)
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
void ff_block_permute(int16_t *block, uint8_t *permutation, const uint8_t *scantable, int last)
Permute an 8x8 block according to permutation.
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static int dnxhd_10bit_dct_quantize_444(MpegEncContext *ctx, int16_t *block, int n, int qscale, int *overflow)
static int dnxhd_encode_fast(AVCodecContext *avctx, DNXHDEncContext *ctx)
int av_log2_16bit(unsigned v)
static void dnxhd_8bit_get_pixels_8x4_sym(int16_t *av_restrict block, const uint8_t *pixels, ptrdiff_t line_size)
This structure describes decoded (raw) audio or video data.
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
#define DNX10BIT_QMAT_SHIFT
#define MASK_ABS(mask, level)
av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx)
static int dnxhd_write_header(AVCodecContext *avctx, uint8_t *buf)
static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx)
int mb_decision
macroblock decision mode
int qmax
maximum quantizer
static av_cold int dnxhd_encode_end(AVCodecContext *avctx)
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
static av_always_inline void dnxhd_encode_dc(DNXHDEncContext *ctx, int diff)
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
#define AV_PIX_FMT_GBRP10
void(* get_pixels)(int16_t *av_restrict block, const uint8_t *pixels, ptrdiff_t stride)
void ff_convert_matrix(MpegEncContext *s, int(*qmat)[64], uint16_t(*qmat16)[2][64], const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel)
int flags
AV_CODEC_FLAG_*.
static double val(void *priv, double ch)
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
static int dnxhd_encode_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
#define FF_PROFILE_DNXHR_LB
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
#define AV_PIX_FMT_YUV444P10
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
static int dnxhd_mb_var_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
int ff_dnxhd_get_hr_frame_size(int cid, int w, int h)
#define LOCAL_ALIGNED_16(t, v,...)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static enum AVPixelFormat pix_fmts[]
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
static void dnxhd_load_picture(DNXHDEncContext *ctx, const AVFrame *frame)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static void radix_sort(RCCMPEntry *data, RCCMPEntry *tmp, int size)
const AVProfile ff_dnxhd_profiles[]
static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias)
#define FF_PROFILE_DNXHR_HQ
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
av_cold void ff_mpv_idct_init(MpegEncContext *s)
static void radix_sort_pass(RCCMPEntry *dst, const RCCMPEntry *data, int size, int buckets[NBUCKETS], int pass)
int ff_dct_quantize_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow)
#define DNXHD_VARIABLE
Indicate that a CIDEntry value must be read in the bitstream.
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PICTURE_TYPE_I
Intra.
AVIOContext * pb
I/O context.
static void radix_count(const RCCMPEntry *data, int size, int buckets[RADIX_PASSES][NBUCKETS])
static const AVClass dnxhd_class
#define AV_PIX_FMT_YUV422P10
static void dnxhd_setup_threads_slices(DNXHDEncContext *ctx)
static int dnxhd_10bit_dct_quantize(MpegEncContext *ctx, int16_t *block, int n, int qscale, int *overflow)
static int dnxhd_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
void ff_dnxhdenc_init_x86(DNXHDEncContext *ctx)
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
static av_cold int dnxhd_init_vlc(DNXHDEncContext *ctx)
static av_always_inline int dnxhd_ssd_block(int16_t *qblock, int16_t *block)
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
static int dnxhd_find_qscale(DNXHDEncContext *ctx)
const CIDEntry * ff_dnxhd_get_cid_table(int cid)
#define FF_PROFILE_DNXHR_SQ
void(* emulated_edge_mc)(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_linesize, ptrdiff_t src_linesize, int block_w, int block_h, int src_x, int src_y, int w, int h)
Copy a rectangular area of samples to a temporary buffer and replicate the border samples.
#define i(width, name, range_min, range_max)
static int put_bits_count(PutBitContext *s)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const AVCodec ff_dnxhd_encoder
const uint8_t ff_zigzag_direct[64]
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
static int get_bucket(int value, int shift)
int ff_dct_encode_init(MpegEncContext *s)
main external API structure.
int active_thread_type
Which multithreading methods are in use by the codec.
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
static av_always_inline void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth)
static av_always_inline int dnxhd_switch_matrix(DNXHDEncContext *ctx, int i)
static float mean(const float *input, int size)
#define FF_PROFILE_DNXHR_HQX
#define FF_MB_DECISION_RD
rate distortion
static int shift(int a, int b)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Undefined Behavior In the C some operations are like signed integer overflow
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
static av_always_inline int diff(const uint32_t a, const uint32_t b)
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
This structure stores compressed data.
#define FF_PROFILE_DNXHR_444
int width
picture width / height.
The exact code depends on how similar the blocks are and how related they are to the block
#define MKTAG(a, b, c, d)
static int dnxhd_calc_bits_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
static int first_field(const struct video_data *s)
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
static av_always_inline void dnxhd_10bit_get_pixels_8x4_sym(int16_t *av_restrict block, const uint8_t *pixels, ptrdiff_t line_size)
static av_always_inline void dnxhd_unquantize_c(DNXHDEncContext *ctx, int16_t *block, int n, int qscale, int last_index)
static const AVCodecDefault dnxhd_defaults[]