Go to the documentation of this file.
33 #include "config_components.h"
59 const uint8_t **pbuf_ptr,
size_t *pbuf_size);
88 ht[
i].bits, ht[
i].values,
89 ht[
i].class == 1,
s->avctx);
93 if (ht[
i].
class < 2) {
94 memcpy(
s->raw_huffman_lengths[ht[
i].class][ht[
i].index],
96 memcpy(
s->raw_huffman_values[ht[
i].class][ht[
i].index],
97 ht[
i].values, ht[
i].length);
106 if (
len > 12 && buf[12] == 1)
107 s->interlace_polarity = 1;
108 if (
len > 12 && buf[12] == 2)
109 s->interlace_polarity = 0;
120 s->idsp.idct_permutation);
128 if (!
s->picture_ptr) {
132 s->picture_ptr =
s->picture;
140 s->first_picture = 1;
150 #if FF_API_MJPEG_EXTERN_HUFF
156 "error using external huffman table, switching back to internal\n");
163 s->interlace_polarity = 1;
167 s->interlace_polarity = 1;
174 if (
s->smv_frames_per_jpeg <= 0) {
197 int len = bytestream2_get_be16u(&
s->gB);
216 uint8_t
b = bytestream2_get_byteu(&
s->gB);
222 if (
len < (1 + 64 * (1 + pr)))
229 for (
i = 0;
i < 64;
i++) {
230 s->quant_matrixes[
index][
i] = pr ? bytestream2_get_be16u(&
s->gB) : bytestream2_get_byteu(&
s->gB);
231 if (
s->quant_matrixes[
index][
i] == 0) {
233 av_log(
s->avctx, log_level,
"dqt: 0 quant value\n");
241 s->quant_matrixes[
index][8]) >> 1;
244 len -= 1 + 64 * (1 + pr);
253 uint8_t bits_table[17];
254 uint8_t val_table[256];
264 uint8_t
b = bytestream2_get_byteu(&
s->gB);
272 for (
i = 1;
i <= 16;
i++) {
273 bits_table[
i] = bytestream2_get_byteu(&
s->gB);
277 if (len < n || n > 256)
280 for (
i = 0;
i < n;
i++) {
281 v = bytestream2_get_byteu(&
s->gB);
291 val_table,
class > 0,
s->avctx)) < 0)
297 val_table, 0,
s->avctx)) < 0)
301 for (
i = 0;
i < 16;
i++)
302 s->raw_huffman_lengths[
class][
index][
i] = bits_table[
i + 1];
304 s->raw_huffman_values[
class][
index][
i] = val_table[
i];
317 memset(
s->upscale_h, 0,
sizeof(
s->upscale_h));
318 memset(
s->upscale_v, 0,
sizeof(
s->upscale_v));
325 bits = bytestream2_get_byteu(&
s->gB);
332 if (
s->avctx->bits_per_raw_sample !=
bits) {
334 s->avctx->bits_per_raw_sample =
bits;
339 if (
bits == 9 && !
s->pegasus_rct)
342 if (
s->lossless &&
s->avctx->lowres) {
347 height = bytestream2_get_be16u(&
s->gB);
348 width = bytestream2_get_be16u(&
s->gB);
351 if (
s->interlaced &&
s->width ==
width &&
s->height ==
height + 1)
358 if (!
s->progressive && !
s->ls) {
360 if (
s->buf_size && (
width + 7) / 8 * ((
height + 7) / 8) >
s->buf_size * 4LL)
364 nb_components = bytestream2_get_byteu(&
s->gB);
365 if (nb_components <= 0 ||
368 if (
s->interlaced && (
s->bottom_field == !
s->interlace_polarity)) {
369 if (nb_components !=
s->nb_components) {
371 "nb_components changing in interlaced picture\n");
375 if (
s->ls && !(
bits <= 8 || nb_components == 1)) {
377 "JPEG-LS that is not <= 8 "
378 "bits/component or 16-bit gray");
382 if (
len != 3 * nb_components) {
383 av_log(
s->avctx,
AV_LOG_ERROR,
"decode_sof0: error, len(%d) mismatch %d components\n",
len, nb_components);
387 s->nb_components = nb_components;
390 for (
i = 0;
i < nb_components;
i++) {
392 s->component_id[
i] = bytestream2_get_byteu(&
s->gB);
393 uint8_t
b = bytestream2_get_byteu(&
s->gB);
395 v_count[
i] =
b & 0x0F;
397 if (h_count[
i] >
s->h_max)
398 s->h_max = h_count[
i];
399 if (v_count[
i] >
s->v_max)
400 s->v_max = v_count[
i];
401 s->quant_index[
i] = bytestream2_get_byteu(&
s->gB);
402 if (
s->quant_index[
i] >= 4) {
406 if (!h_count[
i] || !v_count[
i]) {
408 "Invalid sampling factor in component %d %d:%d\n",
409 i, h_count[
i], v_count[
i]);
414 i, h_count[
i], v_count[
i],
415 s->component_id[
i],
s->quant_index[
i]);
417 if ( nb_components == 4
418 &&
s->component_id[0] ==
'C'
419 &&
s->component_id[1] ==
'M'
420 &&
s->component_id[2] ==
'Y'
421 &&
s->component_id[3] ==
'K')
422 s->adobe_transform = 0;
424 if (
s->ls && (
s->h_max > 1 ||
s->v_max > 1)) {
430 if (nb_components == 2) {
444 memcmp(
s->h_count, h_count,
sizeof(h_count)) ||
445 memcmp(
s->v_count, v_count,
sizeof(v_count))) {
451 memcpy(
s->h_count, h_count,
sizeof(h_count));
452 memcpy(
s->v_count, v_count,
sizeof(v_count));
457 if (
s->first_picture &&
458 (
s->multiscope != 2 ||
s->avctx->pkt_timebase.den >= 25 *
s->avctx->pkt_timebase.num) &&
459 s->orig_height != 0 &&
460 s->height < ((
s->orig_height * 3) / 4)) {
462 s->bottom_field =
s->interlace_polarity;
473 (
s->avctx->codec_tag ==
MKTAG(
'A',
'V',
'R',
'n') ||
474 s->avctx->codec_tag ==
MKTAG(
'A',
'V',
'D',
'J')) &&
478 s->first_picture = 0;
484 s->avctx->height =
s->avctx->coded_height /
s->smv_frames_per_jpeg;
485 if (
s->avctx->height <= 0)
488 if (
s->bayer &&
s->progressive) {
493 if (
s->got_picture &&
s->interlaced && (
s->bottom_field == !
s->interlace_polarity)) {
494 if (
s->progressive) {
499 if (
s->v_max == 1 &&
s->h_max == 1 &&
s->lossless == 1 && (nb_components == 3 || nb_components == 4))
501 else if (!
s->lossless)
504 pix_fmt_id = ((unsigned)
s->h_count[0] << 28) | (
s->v_count[0] << 24) |
505 (
s->h_count[1] << 20) | (
s->v_count[1] << 16) |
506 (
s->h_count[2] << 12) | (
s->v_count[2] << 8) |
507 (
s->h_count[3] << 4) |
s->v_count[3];
511 if (!(pix_fmt_id & 0xD0D0D0D0))
512 pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
513 if (!(pix_fmt_id & 0x0D0D0D0D))
514 pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
516 for (
i = 0;
i < 8;
i++) {
517 int j = 6 + (
i & 1) - (
i & 6);
518 int is = (pix_fmt_id >> (4 *
i)) & 0xF;
519 int js = (pix_fmt_id >> (4 * j)) & 0xF;
521 if (
is == 1 && js != 2 && (i < 2 || i > 5))
522 js = (pix_fmt_id >> ( 8 + 4 * (
i & 1))) & 0xF;
523 if (
is == 1 && js != 2 && (i < 2 || i > 5))
524 js = (pix_fmt_id >> (16 + 4 * (
i & 1))) & 0xF;
526 if (
is == 1 && js == 2) {
527 if (
i & 1)
s->upscale_h[j / 2] = 1;
528 else s->upscale_v[j / 2] = 1;
533 if (pix_fmt_id != 0x11110000 && pix_fmt_id != 0x11000000)
537 switch (pix_fmt_id) {
547 if (
s->adobe_transform == 0
548 ||
s->component_id[0] ==
'R' &&
s->component_id[1] ==
'G' &&
s->component_id[2] ==
'B') {
562 if (
s->adobe_transform == 0 &&
s->bits <= 8) {
574 if (
s->component_id[0] ==
'R' &&
s->component_id[1] ==
'G' &&
s->component_id[2] ==
'B') {
585 if (
s->adobe_transform == 0 &&
s->bits <= 8) {
587 s->upscale_v[1] =
s->upscale_v[2] = 1;
588 s->upscale_h[1] =
s->upscale_h[2] = 1;
589 }
else if (
s->adobe_transform == 2 &&
s->bits <= 8) {
591 s->upscale_v[1] =
s->upscale_v[2] = 1;
592 s->upscale_h[1] =
s->upscale_h[2] = 1;
611 if (
s->adobe_transform == 0 ||
s->component_id[0] ==
'R' &&
612 s->component_id[1] ==
'G' &&
s->component_id[2] ==
'B') {
638 if (
s->component_id[0] ==
'R' &&
s->component_id[1] ==
'G' &&
s->component_id[2] ==
'B') {
642 s->upscale_v[1] =
s->upscale_v[2] = 1;
644 if (pix_fmt_id == 0x14111100)
645 s->upscale_v[1] =
s->upscale_v[2] = 1;
653 if (
s->component_id[0] ==
'R' &&
s->component_id[1] ==
'G' &&
s->component_id[2] ==
'B') {
657 s->upscale_h[1] =
s->upscale_h[2] = 1;
667 if (
s->component_id[0] ==
'R' &&
s->component_id[1] ==
'G' &&
s->component_id[2] ==
'B')
671 s->upscale_h[0] =
s->upscale_h[2] = 2;
678 s->upscale_h[1] =
s->upscale_h[2] = 2;
695 if (pix_fmt_id == 0x42111100) {
698 s->upscale_h[1] =
s->upscale_h[2] = 1;
699 }
else if (pix_fmt_id == 0x24111100) {
702 s->upscale_v[1] =
s->upscale_v[2] = 1;
703 }
else if (pix_fmt_id == 0x23111100) {
706 s->upscale_v[1] =
s->upscale_v[2] = 2;
718 memset(
s->upscale_h, 0,
sizeof(
s->upscale_h));
719 memset(
s->upscale_v, 0,
sizeof(
s->upscale_v));
727 memset(
s->upscale_h, 0,
sizeof(
s->upscale_h));
728 memset(
s->upscale_v, 0,
sizeof(
s->upscale_v));
729 if (
s->nb_components == 3) {
731 }
else if (
s->nb_components != 1) {
734 }
else if ((
s->palette_index ||
s->force_pal8) &&
s->bits <= 8)
736 else if (
s->bits <= 8)
748 if (
s->avctx->pix_fmt ==
s->hwaccel_sw_pix_fmt && !size_change) {
749 s->avctx->pix_fmt =
s->hwaccel_pix_fmt;
752 #if CONFIG_MJPEG_NVDEC_HWACCEL
755 #if CONFIG_MJPEG_VAAPI_HWACCEL
762 if (
s->hwaccel_pix_fmt < 0)
765 s->hwaccel_sw_pix_fmt =
s->avctx->pix_fmt;
766 s->avctx->pix_fmt =
s->hwaccel_pix_fmt;
786 memset(
s->picture_ptr->data[1], 0, 1024);
788 for (
i = 0;
i < 4;
i++)
789 s->linesize[
i] =
s->picture_ptr->linesize[
i] <<
s->interlaced;
791 ff_dlog(
s->avctx,
"%d %d %d %d %d %d\n",
792 s->width,
s->height,
s->linesize[0],
s->linesize[1],
793 s->interlaced,
s->avctx->height);
797 if ((
s->rgb && !
s->lossless && !
s->ls) ||
798 (!
s->rgb &&
s->ls &&
s->nb_components > 1) ||
806 if (
s->progressive) {
807 int bw = (
width +
s->h_max * 8 - 1) / (
s->h_max * 8);
808 int bh = (
height +
s->v_max * 8 - 1) / (
s->v_max * 8);
809 for (
i = 0;
i <
s->nb_components;
i++) {
810 int size = bw * bh *
s->h_count[
i] *
s->v_count[
i];
815 if (!
s->blocks[
i] || !
s->last_nnz[
i])
817 s->block_stride[
i] = bw *
s->h_count[
i];
819 memset(
s->coefs_finished, 0,
sizeof(
s->coefs_finished));
822 if (
s->avctx->hwaccel) {
824 s->hwaccel_picture_private =
826 if (!
s->hwaccel_picture_private)
830 s->raw_image_buffer_size);
842 if (code < 0 || code > 16) {
844 "mjpeg_decode_dc: bad vlc: %d\n", dc_index);
854 int dc_index,
int ac_index, uint16_t *quant_matrix)
863 val =
val * (unsigned)quant_matrix[0] +
s->last_dc[component];
864 s->last_dc[component] =
val;
874 i += ((unsigned)
code) >> 4;
882 int sign = (~cache) >> 31;
892 j =
s->permutated_scantable[
i];
903 int component,
int dc_index,
904 uint16_t *quant_matrix,
int Al)
907 s->bdsp.clear_block(
block);
912 val = (
val * (quant_matrix[0] << Al)) +
s->last_dc[component];
913 s->last_dc[component] =
val;
920 uint8_t *last_nnz,
int ac_index,
921 uint16_t *quant_matrix,
922 int Ss,
int Se,
int Al,
int *EOBRUN)
934 for (
i = Ss; ;
i++) {
945 int sign = (~cache) >> 31;
953 j =
s->permutated_scantable[Se];
960 j =
s->permutated_scantable[
i];
991 #define REFINE_BIT(j) { \
992 UPDATE_CACHE(re, &s->gb); \
993 sign = block[j] >> 15; \
994 block[j] += SHOW_UBITS(re, &s->gb, 1) * \
995 ((quant_matrix[i] ^ sign) - sign) << Al; \
996 LAST_SKIP_BITS(re, &s->gb, 1); \
1004 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
1009 j = s->permutated_scantable[i]; \
1012 else if (run-- == 0) \
1019 int ac_index, uint16_t *quant_matrix,
1020 int Ss,
int Se,
int Al,
int *EOBRUN)
1023 int last =
FFMIN(Se, *last_nnz);
1031 GET_VLC(
code, re, &
s->gb,
s->vlcs[2][ac_index].table, 9, 2);
1038 j =
s->permutated_scantable[
i];
1070 for (;
i <= last;
i++) {
1071 j =
s->permutated_scantable[
i];
1085 int nb_components =
s->nb_components_sos;
1087 int point_transform =
s->Al;
1091 int left[4], top[4], topleft[4];
1092 const int linesize =
s->linesize[0];
1093 const int mask = ((1 <<
s->bits) - 1) << point_transform;
1094 int resync_mb_y = 0;
1095 int resync_mb_x = 0;
1099 if (!
s->bayer &&
s->nb_components < 3)
1101 if (
s->bayer &&
s->nb_components > 2)
1103 if (
s->nb_components <= 0 ||
s->nb_components > 4)
1105 if (
s->v_max != 1 ||
s->h_max != 1 || !
s->lossless)
1108 if (
s->rct ||
s->pegasus_rct)
1113 for (
i = 0;
i < 6;
i++)
1114 vpred[
i] = 1 << (
s->bits - 1);
1117 width =
s->mb_width / nb_components;
1122 if (!
s->ljpeg_buffer)
1127 for (
i = 0;
i < 4;
i++)
1130 s->restart_count = -1;
1132 for (mb_y = 0; mb_y <
s->mb_height; mb_y++) {
1133 uint8_t *ptr =
s->picture_ptr->data[0] + (linesize * mb_y);
1135 if (
s->interlaced &&
s->bottom_field)
1136 ptr += linesize >> 1;
1138 for (
i = 0;
i < 4;
i++)
1141 for (mb_x = 0; mb_x <
width; mb_x++) {
1151 for (
i = 0;
i < 4;
i++)
1152 top[
i] =
left[
i] = topleft[
i] = 1 << (
s->bits - 1);
1160 if (mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x || !mb_x)
1161 modified_predictor = 1;
1163 for (
i = 0;
i < nb_components;
i++) {
1166 topleft[
i] = top[
i];
1173 if (!
s->bayer || mb_x) {
1183 mask & (
pred + (unsigned)(
dc * (1 << point_transform)));
1186 if (
s->rct &&
s->nb_components == 4) {
1187 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1188 ptr[4 * mb_x + 2] =
buffer[mb_x][0] - ((
buffer[mb_x][1] +
buffer[mb_x][2] - 0x200) >> 2);
1189 ptr[4 * mb_x + 1] =
buffer[mb_x][1] + ptr[4 * mb_x + 2];
1190 ptr[4 * mb_x + 3] =
buffer[mb_x][2] + ptr[4 * mb_x + 2];
1191 ptr[4 * mb_x + 0] =
buffer[mb_x][3];
1193 }
else if (
s->nb_components == 4) {
1194 for (
i = 0;
i < nb_components;
i++) {
1195 int c =
s->comp_index[
i];
1197 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1198 ptr[4 * mb_x + 3 -
c] =
buffer[mb_x][
i];
1200 }
else if (
s->bits == 9) {
1203 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1204 ((uint16_t*)ptr)[4 * mb_x +
c] =
buffer[mb_x][
i];
1208 }
else if (
s->rct) {
1209 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1210 ptr[3 * mb_x + 1] =
buffer[mb_x][0] - ((
buffer[mb_x][1] +
buffer[mb_x][2] - 0x200) >> 2);
1211 ptr[3 * mb_x + 0] =
buffer[mb_x][1] + ptr[3 * mb_x + 1];
1212 ptr[3 * mb_x + 2] =
buffer[mb_x][2] + ptr[3 * mb_x + 1];
1214 }
else if (
s->pegasus_rct) {
1215 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1217 ptr[3 * mb_x + 0] =
buffer[mb_x][1] + ptr[3 * mb_x + 1];
1218 ptr[3 * mb_x + 2] =
buffer[mb_x][2] + ptr[3 * mb_x + 1];
1220 }
else if (
s->bayer) {
1223 if (nb_components == 1) {
1225 for (mb_x = 0; mb_x <
width; mb_x++)
1226 ((uint16_t*)ptr)[mb_x] =
buffer[mb_x][0];
1227 }
else if (nb_components == 2) {
1228 for (mb_x = 0; mb_x <
width; mb_x++) {
1229 ((uint16_t*)ptr)[2 * mb_x + 0] =
buffer[mb_x][0];
1230 ((uint16_t*)ptr)[2 * mb_x + 1] =
buffer[mb_x][1];
1234 for (
i = 0;
i < nb_components;
i++) {
1235 int c =
s->comp_index[
i];
1237 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1238 ptr[3 * mb_x + 2 -
c] =
buffer[mb_x][
i];
1240 }
else if (
s->bits == 9) {
1243 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1244 ((uint16_t*)ptr)[3 * mb_x + 2 -
c] =
buffer[mb_x][
i];
1256 int point_transform =
s->Al;
1257 int nb_components =
s->nb_components_sos;
1258 int i, mb_x, mb_y,
mask;
1259 int bits = (
s->bits + 7) & ~7;
1260 int resync_mb_y = 0;
1261 int resync_mb_x = 0;
1264 point_transform +=
bits -
s->bits;
1265 mask = ((1 <<
s->bits) - 1) << point_transform;
1267 av_assert0(nb_components >= 1 && nb_components <= 4);
1269 s->restart_count = -1;
1271 for (mb_y = 0; mb_y <
s->mb_height; mb_y++) {
1272 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1287 if (!mb_x || mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x || s->
interlaced) {
1288 int toprow = mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x;
1289 int leftcol = !mb_x || mb_y == resync_mb_y && mb_x == resync_mb_x;
1290 for (
i = 0;
i < nb_components;
i++) {
1293 int n,
h, v, x, y,
c, j, linesize;
1294 n =
s->nb_blocks[
i];
1295 c =
s->comp_index[
i];
1300 linesize =
s->linesize[
c];
1302 if (
bits > 8) linesize /= 2;
1304 for (j = 0; j < n; j++) {
1311 if (
h * mb_x + x >=
s->width
1312 || v * mb_y + y >=
s->height) {
1314 }
else if (
bits <= 8) {
1315 ptr =
s->picture_ptr->data[
c] + (linesize * (v * mb_y + y)) + (
h * mb_x + x);
1316 if (y == 0 && toprow) {
1317 if (x == 0 && leftcol) {
1323 if (x == 0 && leftcol) {
1324 pred = ptr[-linesize];
1330 if (
s->interlaced &&
s->bottom_field)
1331 ptr += linesize >> 1;
1333 *ptr =
pred + ((unsigned)
dc << point_transform);
1335 ptr16 = (uint16_t*)(
s->picture_ptr->data[
c] + 2 * (linesize * (v * mb_y + y)) + 2 * (
h * mb_x + x));
1336 if (y == 0 && toprow) {
1337 if (x == 0 && leftcol) {
1343 if (x == 0 && leftcol) {
1344 pred = ptr16[-linesize];
1350 if (
s->interlaced &&
s->bottom_field)
1351 ptr16 += linesize >> 1;
1353 *ptr16 =
pred + ((unsigned)
dc << point_transform);
1362 for (
i = 0;
i < nb_components;
i++) {
1365 int n,
h, v, x, y,
c, j, linesize,
dc;
1366 n =
s->nb_blocks[
i];
1367 c =
s->comp_index[
i];
1372 linesize =
s->linesize[
c];
1374 if (
bits > 8) linesize /= 2;
1376 for (j = 0; j < n; j++) {
1383 if (
h * mb_x + x >=
s->width
1384 || v * mb_y + y >=
s->height) {
1386 }
else if (
bits <= 8) {
1387 ptr =
s->picture_ptr->data[
c] +
1388 (linesize * (v * mb_y + y)) +
1393 *ptr =
pred + ((unsigned)
dc << point_transform);
1395 ptr16 = (uint16_t*)(
s->picture_ptr->data[
c] + 2 * (linesize * (v * mb_y + y)) + 2 * (
h * mb_x + x));
1399 *ptr16 =
pred + ((unsigned)
dc << point_transform);
1415 uint8_t *
dst,
const uint8_t *
src,
1416 int linesize,
int lowres)
1419 case 0:
s->copy_block(
dst,
src, linesize, 8);
1432 int block_x, block_y;
1433 int size = 8 >>
s->avctx->lowres;
1435 for (block_y = 0; block_y <
size; block_y++)
1436 for (block_x = 0; block_x <
size; block_x++)
1437 *(uint16_t*)(ptr + 2 * block_x + block_y * linesize) <<= 16 -
s->bits;
1439 for (block_y = 0; block_y <
size; block_y++)
1440 for (block_x = 0; block_x <
size; block_x++)
1441 *(ptr + block_x + block_y * linesize) <<= 8 -
s->bits;
1447 int nb_components =
s->nb_components_sos;
1450 const uint8_t *mb_bitmask =
NULL;
1452 int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height;
1457 int bytes_per_pixel = 1 + (
s->bits > 8);
1461 mb_bitmask =
s->mb_bitmask;
1462 reference =
s->reference;
1466 if (
s->mb_bitmask_size != (
s->mb_width *
s->mb_height + 7) >> 3) {
1470 init_get_bits(&mb_bitmask_gb, mb_bitmask,
s->mb_width *
s->mb_height);
1478 for (
i = 0;
i < nb_components;
i++) {
1479 int c =
s->comp_index[
i];
1480 data[
c] =
s->picture_ptr->data[
c];
1481 reference_data[
c] = reference ? reference->
data[
c] :
NULL;
1482 linesize[
c] =
s->linesize[
c];
1483 s->coefs_finished[
c] |= 1;
1487 s->restart_count = -1;
1489 for (mb_y = 0; mb_y <
s->mb_height; mb_y++) {
1490 for (mb_x = 0; mb_x <
s->mb_width; mb_x++) {
1495 if (
s->restart_count < 0) {
1509 for (
i = 0;
i < nb_components;
i++)
1510 s->last_dc[
i] = (4 <<
s->bits);
1518 for (
i = 0;
i < nb_components;
i++) {
1520 int n,
h, v, x, y,
c, j;
1522 n =
s->nb_blocks[
i];
1523 c =
s->comp_index[
i];
1528 for (j = 0; j < n; j++) {
1529 block_offset = (((linesize[
c] * (v * mb_y + y) * 8) +
1530 (
h * mb_x + x) * 8 * bytes_per_pixel) >>
s->avctx->lowres);
1532 if (
s->interlaced &&
s->bottom_field)
1533 block_offset += linesize[
c] >> 1;
1534 if ( 8 * (
h * mb_x + x) < ((
c == 1) || (
c == 2) ? chroma_width :
s->width)
1535 && 8 * (v * mb_y + y) < ((
c == 1) || (
c == 2) ? chroma_height :
s->height)) {
1536 ptr =
data[
c] + block_offset;
1539 if (!
s->progressive) {
1543 linesize[
c],
s->avctx->lowres);
1546 s->bdsp.clear_block(
s->block);
1548 s->dc_index[
i],
s->ac_index[
i],
1549 s->quant_matrixes[
s->quant_sindex[
i]]) < 0) {
1551 "error y=%d x=%d\n", mb_y, mb_x);
1554 if (ptr && linesize[
c]) {
1555 s->idsp.idct_put(ptr, linesize[
c],
s->block);
1561 int block_idx =
s->block_stride[
c] * (v * mb_y + y) +
1563 int16_t *
block =
s->blocks[
c][block_idx];
1566 s->quant_matrixes[
s->quant_sindex[
i]][0] << Al;
1568 s->quant_matrixes[
s->quant_sindex[
i]],
1571 "error y=%d x=%d\n", mb_y, mb_x);
1575 ff_dlog(
s->avctx,
"mb: %d %d processed\n", mb_y, mb_x);
1576 ff_dlog(
s->avctx,
"%d %d %d %d %d %d %d %d \n",
1577 mb_x, mb_y, x, y,
c,
s->bottom_field,
1578 (v * mb_y + y) * 8, (
h * mb_x + x) * 8);
1588 if (
s->interlaced &&
1591 s->gB.buffer[-2] == 0xFF &&
1592 s->gB.buffer[-1] == 0xD1) {
1594 s->bottom_field ^= 1;
1610 int c =
s->comp_index[0];
1611 uint16_t *quant_matrix =
s->quant_matrixes[
s->quant_sindex[0]];
1614 if (Se < Ss || Se > 63) {
1621 s->coefs_finished[
c] |= (2ULL << Se) - (1ULL << Ss);
1623 s->restart_count = -1;
1625 for (mb_y = 0; mb_y <
s->mb_height; mb_y++) {
1626 int block_idx = mb_y *
s->block_stride[
c];
1627 int16_t (*
block)[64] = &
s->blocks[
c][block_idx];
1628 uint8_t *last_nnz = &
s->last_nnz[
c][block_idx];
1629 for (mb_x = 0; mb_x <
s->mb_width; mb_x++,
block++, last_nnz++) {
1640 quant_matrix, Ss, Se, Al, &EOBRUN);
1643 quant_matrix, Ss, Se, Al, &EOBRUN);
1649 "error y=%d x=%d\n", mb_y, mb_x);
1661 const int bytes_per_pixel = 1 + (
s->bits > 8);
1662 const int block_size =
s->lossless ? 1 : 8;
1664 for (
c = 0;
c <
s->nb_components;
c++) {
1665 uint8_t *
data =
s->picture_ptr->data[
c];
1666 int linesize =
s->linesize[
c];
1667 int h =
s->h_max /
s->h_count[
c];
1668 int v =
s->v_max /
s->v_count[
c];
1669 int mb_width = (
s->width +
h * block_size - 1) / (
h * block_size);
1670 int mb_height = (
s->height + v * block_size - 1) / (v * block_size);
1672 if (~
s->coefs_finished[
c])
1675 if (
s->interlaced &&
s->bottom_field)
1676 data += linesize >> 1;
1678 for (mb_y = 0; mb_y < mb_height; mb_y++) {
1679 uint8_t *ptr =
data + (mb_y * linesize * 8 >>
s->avctx->lowres);
1680 int block_idx = mb_y *
s->block_stride[
c];
1681 int16_t (*
block)[64] = &
s->blocks[
c][block_idx];
1682 for (mb_x = 0; mb_x < mb_width; mb_x++,
block++) {
1683 s->idsp.idct_put(ptr, linesize, *
block);
1686 ptr += bytes_per_pixel * 8 >>
s->avctx->lowres;
1696 const int block_size =
s->lossless ? 1 : 8;
1698 if (!
s->got_picture) {
1700 "Can not process SOS before SOF, skipping\n");
1709 s->nb_components_sos = bytestream2_get_byteu(&
s->gB);
1712 "decode_sos: nb_components (%d)",
1713 s->nb_components_sos);
1716 if (
len != 4 + 2 *
s->nb_components_sos) {
1720 for (
i = 0;
i <
s->nb_components_sos;
i++) {
1721 id = bytestream2_get_byteu(&
s->gB);
1725 if (
id ==
s->component_id[
index])
1727 if (
index ==
s->nb_components) {
1729 "decode_sos: index(%d) out of components\n",
index);
1733 if (
s->avctx->codec_tag ==
MKTAG(
'M',
'T',
'S',
'J')
1734 &&
s->nb_components_sos == 3 &&
s->nb_components == 3 &&
i)
1737 s->quant_sindex[
i] =
s->quant_index[
index];
1739 s->h_scount[
i] =
s->h_count[
index];
1740 s->v_scount[
i] =
s->v_count[
index];
1744 uint8_t
b = bytestream2_get_byteu(&
s->gB);
1745 s->dc_index[
i] =
b >> 4;
1746 s->ac_index[
i] =
b & 0x0F;
1748 if (
s->dc_index[
i] < 0 ||
s->ac_index[
i] < 0 ||
1749 s->dc_index[
i] >= 4 ||
s->ac_index[
i] >= 4)
1751 if (!
s->vlcs[0][
s->dc_index[
i]].table || !(
s->progressive ?
s->vlcs[2][
s->ac_index[0]].table :
s->vlcs[1][
s->ac_index[
i]].table))
1755 s->Ss = bytestream2_get_byteu(&
s->gB);
1756 s->Se = bytestream2_get_byteu(&
s->gB);
1757 uint8_t
b = bytestream2_get_byteu(&
s->gB);
1761 if (
s->nb_components_sos > 1) {
1763 s->mb_width = (
s->width +
s->h_max * block_size - 1) / (
s->h_max * block_size);
1764 s->mb_height = (
s->height +
s->v_max * block_size - 1) / (
s->v_max * block_size);
1765 }
else if (!
s->ls) {
1766 h =
s->h_max /
s->h_scount[0];
1767 v =
s->v_max /
s->v_scount[0];
1768 s->mb_width = (
s->width +
h * block_size - 1) / (
h * block_size);
1769 s->mb_height = (
s->height + v * block_size - 1) / (v * block_size);
1770 s->nb_blocks[0] = 1;
1777 s->lossless ?
"lossless" :
"sequential DCT",
s->rgb ?
"RGB" :
"",
1778 s->Ss,
s->Al,
s->Se,
s->bits,
s->mjpb_skiptosod,
1779 s->pegasus_rct ?
"PRCT" : (
s->rct ?
"RCT" :
""),
s->nb_components_sos);
1783 if (
s->mjpb_skiptosod)
1786 if (
s->avctx->hwaccel) {
1787 const uint8_t *buf_ptr;
1799 if (CONFIG_JPEGLS_DECODER &&
s->ls) {
1803 if (
s->rgb ||
s->bayer) {
1812 if (
s->progressive &&
s->Ss) {
1839 if (bytestream2_get_be16u(&
s->gB) != 4)
1841 s->restart_interval = bytestream2_get_be16u(&
s->gB);
1843 s->restart_interval);
1863 id = bytestream2_get_be32u(&
s->gB);
1882 i = bytestream2_get_byteu(&
s->gB);
len--;
1888 int t_w, t_h, v1, v2;
1892 v1 = bytestream2_get_byteu(&
s->gB);
1893 v2 = bytestream2_get_byteu(&
s->gB);
1896 s->avctx->sample_aspect_ratio.num = bytestream2_get_be16u(&
s->gB);
1897 s->avctx->sample_aspect_ratio.den = bytestream2_get_be16u(&
s->gB);
1898 if (
s->avctx->sample_aspect_ratio.num <= 0
1899 ||
s->avctx->sample_aspect_ratio.den <= 0) {
1900 s->avctx->sample_aspect_ratio.num = 0;
1901 s->avctx->sample_aspect_ratio.den = 1;
1906 "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1908 s->avctx->sample_aspect_ratio.num,
1909 s->avctx->sample_aspect_ratio.den);
1913 t_w = bytestream2_get_byteu(&
s->gB);
1914 t_h = bytestream2_get_byteu(&
s->gB);
1917 if (
len - 10 - (t_w * t_h * 3) > 0)
1918 len -= t_w * t_h * 3;
1927 && bytestream2_peek_byteu(&
s->gB) ==
'e'
1928 && bytestream2_peek_be32u(&
s->gB) !=
AV_RB32(
"e_CM")) {
1933 s->adobe_transform = bytestream2_get_byteu(&
s->gB);
1935 av_log(
s->avctx,
AV_LOG_INFO,
"mjpeg: Adobe header found, transform=%d\n",
s->adobe_transform);
1942 int pegasus_rct =
s->pegasus_rct;
1945 "Pegasus lossless jpeg header found\n");
1952 switch (
i = bytestream2_get_byteu(&
s->gB)) {
1969 if (
rgb !=
s->rgb || pegasus_rct !=
s->pegasus_rct) {
1975 s->pegasus_rct = pegasus_rct;
1980 s->colr = bytestream2_get_byteu(&
s->gB);
1987 s->xfrm = bytestream2_get_byteu(&
s->gB);
2003 flags = bytestream2_get_byteu(&
s->gB);
2004 layout = bytestream2_get_byteu(&
s->gB);
2005 type = bytestream2_get_byteu(&
s->gB);
2015 }
else if (
type == 1) {
2027 if (!(
flags & 0x04)) {
2041 if (
s->exif_metadata.entries) {
2060 id = bytestream2_get_be32u(&
s->gB);
2082 unsigned nummarkers;
2084 id = bytestream2_get_be32u(&
s->gB);
2085 id2 = bytestream2_get_be24u(&
s->gB);
2093 seqno = bytestream2_get_byteu(&
s->gB);
2100 nummarkers = bytestream2_get_byteu(&
s->gB);
2102 if (nummarkers == 0) {
2105 }
else if (
s->iccnum != 0 && nummarkers !=
s->iccnum) {
2108 }
else if (seqno > nummarkers) {
2114 if (
s->iccnum == 0) {
2119 s->iccnum = nummarkers;
2122 if (
s->iccentries[seqno - 1].data) {
2127 s->iccentries[seqno - 1].length =
len;
2129 if (!
s->iccentries[seqno - 1].data) {
2138 if (
s->iccread >
s->iccnum)
2146 "mjpeg: error, decode_app parser read over the end\n");
2167 for (
i = 0;
i <
len;
i++)
2168 cbuf[
i] = bytestream2_get_byteu(&
s->gB);
2169 if (cbuf[
i - 1] ==
'\n')
2178 if (!strncmp(cbuf,
"AVID", 4)) {
2180 }
else if (!strcmp(cbuf,
"CS=ITU601"))
2182 else if ((!strncmp(cbuf,
"Intel(R) JPEG Library, version 1", 32) &&
s->avctx->codec_tag) ||
2183 (!strncmp(cbuf,
"Metasoft MJPEG Codec", 20)))
2185 else if (!strcmp(cbuf,
"MULTISCOPE II")) {
2186 s->avctx->sample_aspect_ratio = (
AVRational) { 1, 2 };
2199 const uint8_t *buf_ptr;
2202 buf_ptr = *pbuf_ptr;
2203 while ((buf_ptr = memchr(buf_ptr, 0xff, buf_end - buf_ptr))) {
2205 while (buf_ptr < buf_end) {
2218 (buf_ptr - *pbuf_ptr) - (
val < 0 ? 0 : 2));
2219 *pbuf_ptr = buf_ptr;
2224 const uint8_t **pbuf_ptr,
size_t *pbuf_size)
2226 const uint8_t *buf_ptr =
s->gB.buffer;
2231 const uint8_t *ptr = buf_ptr;
2232 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2234 if (ptr < buf_end) {
2237 while (x == 0xff && ptr < buf_end)
2239 if (x && (x < RST0 || x >
RST7)) {
2248 *pbuf_ptr = buf_ptr;
2249 *pbuf_size = ptr - buf_ptr;
2255 const uint8_t *buf_ptr =
s->gB.buffer;
2257 const uint8_t *unescaped_buf_ptr;
2258 size_t unescaped_buf_size;
2265 unescaped_buf_ptr = buf_ptr;
2266 unescaped_buf_size = buf_end - buf_ptr;
2276 const uint8_t *
src = buf_ptr;
2277 const uint8_t *ptr =
src;
2278 uint8_t *
dst =
s->buffer;
2283 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2285 if (ptr < buf_end) {
2287 ptrdiff_t length = (ptr - 1) -
src;
2293 while (x == 0xff && ptr < buf_end)
2299 bytestream2_put_byteu(&pb, 0xff);
2300 }
else if (x >=
RST0 && x <=
RST7) {
2312 ptrdiff_t length = ptr -
src;
2317 unescaped_buf_ptr =
s->buffer;
2319 memset(
s->buffer + unescaped_buf_size, 0,
2325 (buf_end - buf_ptr) - (unescaped_buf_size));
2327 const uint8_t *
src = buf_ptr;
2328 const uint8_t *ptr =
src;
2329 uint8_t *
dst =
s->buffer;
2334 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2336 if (ptr < buf_end) {
2338 ptrdiff_t length = (ptr - 1) -
src;
2344 while (x == 0xff && ptr < buf_end)
2351 }
else if (x >=
RST0 && x <=
RST7) {
2363 ptrdiff_t length = ptr -
src;
2370 unescaped_buf_ptr =
dst;
2372 memset(
s->buffer + unescaped_buf_size, 0,
2386 if (
s->iccentries) {
2387 for (
i = 0;
i <
s->iccnum;
i++)
2397 int *got_frame,
const AVPacket *avpkt,
2398 const uint8_t *buf,
const int buf_size)
2401 const uint8_t *buf_end, *buf_ptr;
2410 s->buf_size = buf_size;
2414 s->adobe_transform = -1;
2421 buf_end = buf + buf_size;
2422 while (buf_ptr < buf_end) {
2429 ptrdiff_t bytes_left = buf_end - buf_ptr;
2430 if (bytes_left > INT_MAX / 8) {
2432 "MJPEG packet 0x%x too big (%td/%d), corrupt data?\n",
2466 if (!CONFIG_JPEGLS_DECODER &&
2487 s->restart_interval = 0;
2488 s->raw_image_buffer = buf_ptr;
2489 s->raw_image_buffer_size = buf_end - buf_ptr;
2520 #if FF_API_CODEC_PROPS
2533 #if FF_API_CODEC_PROPS
2545 if (!CONFIG_JPEGLS_DECODER ||
2554 s->progressive &&
s->cur_scan &&
s->got_picture)
2557 if (!
s->got_picture) {
2559 "Found EOI before any SOF, ignoring\n");
2562 if (
s->interlaced) {
2563 s->bottom_field ^= 1;
2565 if (
s->bottom_field == !
s->interlace_polarity)
2613 "mjpeg: unsupported coding type (%x)\n",
start_code);
2625 goto the_end_no_picture;
2633 "marker parser used %d bytes\n",
2636 if (
s->got_picture &&
s->cur_scan) {
2671 for (
p = 0;
p <
s->nb_components;
p++) {
2672 uint8_t *
line =
s->picture_ptr->data[
p];
2675 if (!
s->upscale_h[
p])
2677 if (
p == 1 ||
p == 2) {
2681 if (
s->upscale_v[
p] == 1)
2684 for (
int i = 0;
i <
h;
i++) {
2685 if (
s->upscale_h[
p] == 1) {
2686 if (is16bit) ((uint16_t*)
line)[
w - 1] = ((uint16_t*)
line)[(
w - 1) / 2];
2694 }
else if (
s->upscale_h[
p] == 2) {
2696 ((uint16_t*)
line)[
w - 1] = ((uint16_t*)
line)[(
w - 1) / 3];
2698 ((uint16_t*)
line)[
w - 2] = ((uint16_t*)
line)[
w - 1];
2707 }
else if (
s->upscale_h[
p] == 4) {
2709 uint16_t *line16 = (uint16_t *)
line;
2710 line16[
w - 1] = line16[(
w - 1) >> 2];
2712 line16[
w - 2] = (line16[(
w - 1) >> 2] * 3 + line16[(
w - 2) >> 2]) >> 2;
2714 line16[
w - 3] = (line16[(
w - 1) >> 2] + line16[(
w - 2) >> 2]) >> 1;
2751 for (
p = 0;
p <
s->nb_components;
p++) {
2755 if (!
s->upscale_v[
p])
2757 if (
p == 1 ||
p == 2) {
2761 dst = &((uint8_t *)
s->picture_ptr->data[
p])[(
h - 1) *
s->linesize[
p]];
2763 uint8_t *
src1 = &((uint8_t *)
s->picture_ptr->data[
p])[
i *
s->upscale_v[
p] / (
s->upscale_v[
p] + 1) *
s->linesize[
p]];
2764 uint8_t *
src2 = &((uint8_t *)
s->picture_ptr->data[
p])[(
i + 1) *
s->upscale_v[
p] / (
s->upscale_v[
p] + 1) *
s->linesize[
p]];
2771 dst -=
s->linesize[
p];
2775 if (
s->flipped && !
s->rgb) {
2801 int w =
s->picture_ptr->width;
2802 int h =
s->picture_ptr->height;
2804 for (
int i = 0;
i <
h;
i++) {
2809 +
s->picture_ptr->linesize[
index]*
i;
2811 for (j = 0; j <
w; j++) {
2813 int r =
dst[0][j] * k;
2814 int g =
dst[1][j] * k;
2815 int b =
dst[2][j] * k;
2816 dst[0][j] =
g * 257 >> 16;
2817 dst[1][j] =
b * 257 >> 16;
2818 dst[2][j] =
r * 257 >> 16;
2820 memset(
dst[3], 255,
w);
2824 int w =
s->picture_ptr->width;
2825 int h =
s->picture_ptr->height;
2827 for (
int i = 0;
i <
h;
i++) {
2832 +
s->picture_ptr->linesize[
index]*
i;
2834 for (j = 0; j <
w; j++) {
2836 int r = (255 -
dst[0][j]) * k;
2837 int g = (128 -
dst[1][j]) * k;
2838 int b = (128 -
dst[2][j]) * k;
2839 dst[0][j] =
r * 257 >> 16;
2840 dst[1][j] = (
g * 257 >> 16) + 128;
2841 dst[2][j] = (
b * 257 >> 16) + 128;
2843 memset(
dst[3], 255,
w);
2850 stereo->
type =
s->stereo3d->type;
2851 stereo->
flags =
s->stereo3d->flags;
2856 if (
s->iccnum != 0 &&
s->iccnum ==
s->iccread) {
2862 for (
int i = 0;
i <
s->iccnum;
i++)
2863 total_size +=
s->iccentries[
i].length;
2873 for (
int i = 0;
i <
s->iccnum;
i++) {
2874 memcpy(sd->
data +
offset,
s->iccentries[
i].data,
s->iccentries[
i].length);
2880 if (
s->exif_metadata.entries) {
2898 return buf_ptr - buf;
2916 if (
s->interlaced &&
s->bottom_field == !
s->interlace_polarity &&
s->got_picture && !avctx->
frame_num) {
2921 s->picture_ptr =
NULL;
2928 s->ljpeg_buffer_size = 0;
2930 for (
i = 0;
i < 3;
i++) {
2931 for (j = 0; j < 4; j++)
2953 s->smv_next_frame = 0;
2957 #if CONFIG_MJPEG_DECODER
2958 #if FF_API_MJPEG_EXTERN_HUFF
2959 #define OFFSET(x) offsetof(MJpegDecodeContext, x)
2960 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2962 {
"extern_huff",
"Use external huffman table.",
2968 static const AVClass mjpegdec_class = {
2971 #if FF_API_MJPEG_EXTERN_HUFF
2989 .p.priv_class = &mjpegdec_class,
2995 #if CONFIG_MJPEG_NVDEC_HWACCEL
2998 #if CONFIG_MJPEG_VAAPI_HWACCEL
3005 #if CONFIG_THP_DECODER
3022 #if CONFIG_SMVJPEG_DECODER
3037 s->smv_frame->pts +=
s->smv_frame->duration;
3038 s->smv_next_frame = (
s->smv_next_frame + 1) %
s->smv_frames_per_jpeg;
3040 if (
s->smv_next_frame == 0)
3051 if (
s->smv_next_frame > 0)
3061 s->smv_frame->pkt_dts =
pkt->
dts;
3070 s->smv_frame->duration /=
s->smv_frames_per_jpeg;
3078 smv_process_frame(avctx,
frame);
3083 .
p.
name =
"smvjpeg",
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
#define FF_ENABLE_DEPRECATION_WARNINGS
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
#define AV_LOG_WARNING
Something somehow does not look correct.
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
AVPixelFormat
Pixel format.
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 minimum maximum flags name is the option name
#define AV_EF_EXPLODE
abort decoding on minor error detection
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
static int get_bits_left(GetBitContext *gb)
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 int decode_slice(AVCodecContext *c, void *arg)
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
int av_exif_parse_buffer(void *logctx, const uint8_t *buf, size_t size, AVExifMetadata *ifd, enum AVExifHeaderMode header_mode)
Decodes the EXIF data provided in the buffer and writes it into the struct *ifd.
enum AVColorSpace colorspace
YUV colorspace type.
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
static int put_bytes_output(const PutBitContext *s)
static av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s, uint8_t *dst, const uint8_t *src, int linesize, int lowres)
The official guide to swscale for confused that is
static av_always_inline int bytestream2_tell(const GetByteContext *g)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
#define GET_VLC(code, name, gb, table, bits, max_depth)
If the vlc code is invalid and max_depth=1, then no bits will be removed.
static av_always_inline void bytestream2_skipu(GetByteContext *g, unsigned int size)
const FFCodec ff_smvjpeg_decoder
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
static int get_bits_count(const GetBitContext *s)
static void init_idct(AVCodecContext *avctx)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
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 AV_PIX_FMT_YUVA420P16
@ AVCOL_RANGE_JPEG
Full range content.
const FFCodec ff_mjpeg_decoder
enum AVFieldOrder field_order
Field order.
static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s)
int step
Number of elements between 2 horizontally consecutive pixels.
const uint8_t ff_mjpeg_val_dc[]
#define AV_LOG_VERBOSE
Detailed information.
#define FF_HW_SIMPLE_CALL(avctx, function)
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
#define UPDATE_CACHE(name, gb)
const uint8_t ff_mjpeg_bits_ac_chrominance[]
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
#define FF_DEBUG_PICT_INFO
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#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 GET_CACHE(name, gb)
av_cold void ff_permute_scantable(uint8_t dst[64], const uint8_t src[64], const uint8_t permutation[64])
static av_cold void close(AVCodecParserContext *s)
@ AV_STEREO3D_SIDEBYSIDE
Views are next to each other.
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length)
Copy the content of src to the bitstream.
static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
AVCodec p
The public AVCodec.
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
const struct AVCodec * codec
av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
enum AVDiscard skip_frame
Skip decoding for selected frames.
@ AV_STEREO3D_2D
Video is not stereoscopic (and metadata has to be there).
#define AV_PIX_FMT_YUVA444P16
int ff_mjpeg_decode_frame_from_buf(AVCodecContext *avctx, AVFrame *frame, int *got_frame, const AVPacket *avpkt, const uint8_t *buf, const int buf_size)
static int mjpeg_decode_com(MJpegDecodeContext *s)
static int init_default_huffman_tables(MJpegDecodeContext *s)
int ff_mjpeg_find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
void av_exif_free(AVExifMetadata *ifd)
Frees all resources associated with the given EXIF metadata struct.
static double val(void *priv, double ch)
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.
static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s)
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 type
#define AV_PIX_FMT_GRAY16
static int ff_mjpeg_handle_restart(MJpegDecodeContext *s, int *restart)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
int ff_mjpeg_decode_sos(MJpegDecodeContext *s)
const AVProfile ff_mjpeg_profiles[]
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define FF_ARRAY_ELEMS(a)
static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block, int component, int dc_index, uint16_t *quant_matrix, int Al)
#define AV_PIX_FMT_YUV422P16
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define FF_CODEC_PROPERTY_LOSSLESS
#define AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
static av_always_inline void bytestream2_init_writer(PutByteContext *p, uint8_t *buf, int buf_size)
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
#define CLOSE_READER(name, gb)
#define FF_CODEC_DECODE_CB(func)
@ AV_STEREO3D_LINES
Views are packed per line, as if interlaced.
av_cold void ff_blockdsp_init(BlockDSPContext *c)
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
static int ff_mjpeg_should_restart(MJpegDecodeContext *s)
static void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
#define AV_PIX_FMT_YUV444P16
#define AV_CEIL_RSHIFT(a, b)
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
static av_always_inline int bytestream2_tell_p(const PutByteContext *p)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_PIX_FMT_YUV420P16
static void reset_icc_profile(MJpegDecodeContext *s)
av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
static void mjpeg_find_raw_scan_data(MJpegDecodeContext *s, const uint8_t **pbuf_ptr, size_t *pbuf_size)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define CODEC_LONG_NAME(str)
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
int flags
Additional information about the frame packing.
static int mjpeg_parse_len(MJpegDecodeContext *s, int *plen, const char *name)
@ AVDISCARD_ALL
discard all
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_RGBA64
#define LIBAVUTIL_VERSION_INT
int ff_decode_exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd)
Describe the class of an AVClass context structure.
static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
static void copy_block2(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
@ AV_EXIF_TIFF_HEADER
The TIFF header starts with 0x49492a00, or 0x4d4d002a.
#define AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT
Rational number (pair of numerator and denominator).
int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
struct AVCodecInternal * internal
Private context used for internal data.
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
static int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index, int *val)
const char * av_default_item_name(void *ptr)
Return the context name.
static unsigned int get_bits1(GetBitContext *s)
@ AV_PICTURE_TYPE_I
Intra.
@ AV_FRAME_DATA_ICC_PROFILE
The data contains an ICC profile as an opaque octet buffer following the format described by ISO 1507...
static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, uint8_t *last_nnz, int ac_index, uint16_t *quant_matrix, int Ss, int Se, int Al, int *EOBRUN)
#define LAST_SKIP_BITS(name, gb, num)
const uint8_t ff_mjpeg_val_ac_chrominance[]
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static int mjpeg_decode_app(MJpegDecodeContext *s, int start_code)
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
const OptionDef options[]
static void copy_mb(CinepakEncContext *s, uint8_t *a_data[4], int a_linesize[4], uint8_t *b_data[4], int b_linesize[4])
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int(* init)(AVBSFContext *ctx)
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
const uint8_t ff_mjpeg_val_ac_luminance[]
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
static enum AVPixelFormat pix_fmts[4][4]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
int ff_jpegls_decode_lse(MJpegDecodeContext *s)
Decode LSE block with initialization parameters.
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
int ff_mjpeg_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
#define i(width, name, range_min, range_max)
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_PROFILE_MJPEG_JPEG_LS
const uint8_t ff_mjpeg_bits_ac_luminance[]
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
#define AV_NOPTS_VALUE
Undefined timestamp value.
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.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define OPEN_READER(name, gb)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
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 get_xbits(GetBitContext *s, int n)
Read MPEG-1 dc-style VLC (sign bit + mantissa with no MSB).
#define HWACCEL_NVDEC(codec)
static void predictor(uint8_t *src, ptrdiff_t size)
#define AV_STEREO3D_FLAG_INVERT
Inverted views, Right/Bottom represents the left view.
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
#define AV_LOG_INFO
Standard information.
const FFCodec ff_thp_decoder
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 layout
static void copy_block4(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
#define AV_OPT_FLAG_DEPRECATED
Set if option is deprecated, users should refer to AVOption.help text for more information.
static int decode_block(MJpegDecodeContext *s, int16_t *block, int component, int dc_index, int ac_index, uint16_t *quant_matrix)
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
#define AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS
int ff_jpegls_decode_picture(MJpegDecodeContext *s)
@ AV_FIELD_BB
Bottom coded first, bottom displayed first.
static int mjpeg_decode_scan(MJpegDecodeContext *s)
@ AV_STEREO3D_TOPBOTTOM
Views are on top of each other.
static int mjpeg_decode_dri(MJpegDecodeContext *s)
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
int ff_mjpeg_unescape_sos(MJpegDecodeContext *s)
static av_cold void decode_flush(AVCodecContext *avctx)
#define FF_DEBUG_STARTCODE
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
const char * name
Name of the codec implementation.
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
void * av_calloc(size_t nmemb, size_t size)
#define FF_CODEC_CAP_ICC_PROFILES
Codec supports embedded ICC profiles (AV_FRAME_DATA_ICC_PROFILE).
const uint8_t ff_zigzag_direct[64]
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
int64_t frame_num
Frame counter, set by libavcodec.
void ff_vlc_free(VLC *vlc)
static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block, uint8_t *last_nnz, int ac_index, uint16_t *quant_matrix, int Ss, int Se, int Al, int *EOBRUN)
#define AV_LOG_FATAL
Something went wrong and recovery is not possible.
static const float pred[4]
AVStereo3D * av_stereo3d_alloc(void)
Allocate an AVStereo3D structure and set its fields to default values.
#define FFSWAP(type, a, b)
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
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
enum AVStereo3DType type
How views are packed within the video.
static const uint8_t * align_get_bits(GetBitContext *s)
static const char * hwaccel
@ LSE
JPEG-LS extension parameters.
#define AV_INPUT_BUFFER_PADDING_SIZE
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
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 minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your see the OFFSET() macro
main external API structure.
#define FF_CODEC_RECEIVE_FRAME_CB(func)
#define SHOW_UBITS(name, gb, num)
the frame and frame reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFrame structures Several references can point to the same frame buffer
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
#define FF_HW_CALL(avctx, function,...)
static const FFHWAccel * ffhwaccel(const AVHWAccel *codec)
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 values
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
const uint8_t ff_mjpeg_bits_dc_chrominance[]
int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
#define FF_DISABLE_DEPRECATION_WARNINGS
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
int coded_width
Bitstream width / height, may be different from width/height e.g.
@ AV_PIX_FMT_GRAY16LE
Y , 16bpp, little-endian.
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
static av_always_inline unsigned int bytestream2_get_bufferu(GetByteContext *g, uint8_t *dst, unsigned int size)
AVStereo3D * av_stereo3d_create_side_data(AVFrame *frame)
Allocate a complete AVFrameSideData and add it to the frame.
#define avpriv_request_sample(...)
Structure to hold side data for an AVFrame.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
static av_always_inline unsigned int bytestream2_put_bufferu(PutByteContext *p, const uint8_t *src, unsigned int size)
const FF_VISIBILITY_PUSH_HIDDEN uint8_t ff_mjpeg_bits_dc_luminance[]
int ff_mjpeg_build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table, int is_ac, void *logctx)
This structure stores compressed data.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
#define HWACCEL_VAAPI(codec)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
attribute_deprecated unsigned properties
Properties of the stream that gets decoded.
static const SheerTable rgb[2]
The exact code depends on how similar the blocks are and how related they are to the block
static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define MKTAG(a, b, c, d)
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
#define AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
#define PREDICT(ret, topleft, top, left, predictor)
static int return_frame(AVFilterContext *ctx, int is_second)
#define AV_FRAME_FLAG_LOSSLESS
A decoder can use this flag to mark frames which were originally encoded losslessly.
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
#define av_fourcc2str(fourcc)