Go to the documentation of this file.
27 #define BITSTREAM_READER_LE
37 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19,
38 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56,
39 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56,
40 68,109,103, 77, 24, 35, 55, 64, 81,104,113, 92,
41 49, 64, 78, 87,103,121,120,101, 72, 92, 95, 98,
46 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66,
47 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99,
48 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
49 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
50 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
104 int len = 0, skip = 0,
max;
178 }
else if (
mode == 0) {
195 const int *quant_matrix,
int *skip,
int *dc_level)
197 const uint8_t *scantable =
s->scantable.permutated;
200 memset(
s->wblocks, 0,
s->wblocks_size);
202 for (
int i = 0;
i < 64;
i++) {
203 int16_t *
block =
s->wblocks + scantable[
i];
205 for (
int j = 0; j <
s->blocks_w;) {
209 rskip =
FFMIN(*skip,
s->blocks_w - j);
212 for (
int k = 0; k < rskip; k++)
213 block[64 * k] = *dc_level * quant_matrix[0];
225 block[0] = (
i == 0 ? *dc_level :
level) * quant_matrix[
i];
236 const int *quant_matrix,
int *skip,
239 const uint8_t *scantable =
s->scantable.permutated;
242 memset(
s->wblocks, 0,
s->wblocks_size);
243 memset(
s->map, 0,
s->map_size);
245 for (
int i = 0;
i < 64;
i++) {
246 int16_t *
block =
s->wblocks + scantable[
i];
248 for (
int j = 0; j <
s->blocks_w;) {
252 rskip =
FFMIN(*skip,
s->blocks_w - j);
272 const int *quant_matrix,
int *skip,
int *dc_level)
274 const uint8_t *scantable =
s->scantable.permutated;
275 const int offset =
s->plus ? 0 : 1024;
276 int16_t *
block =
s->block;
279 memset(
block, 0,
sizeof(
s->block));
289 block[scantable[0]] =
offset + *dc_level * quant_matrix[0];
291 for (
int i = 1;
i < 64;) {
295 rskip =
FFMIN(*skip, 64 -
i);
315 int ret, skip = 0, dc_level = 0;
316 const int offset =
s->plus ? 0 : 1024;
323 64 *
s->blocks_w *
sizeof(*
s->wblocks));
327 for (
int y = 0; y <
s->blocks_h; y++) {
332 for (
int x = 0; x <
s->blocks_w; x++) {
339 for (
int y = 0; y <
s->blocks_h; y++) {
340 for (
int x = 0; x <
s->blocks_w; x++) {
361 const int *quant_matrix,
int *skip,
364 const uint8_t *scantable =
s->scantable.permutated;
365 int16_t *
block =
s->block;
368 memset(
block, 0,
sizeof(
s->block));
370 for (
int i = 0;
i < 64;) {
374 rskip =
FFMIN(*skip, 64 -
i);
401 64 *
s->blocks_w *
sizeof(*
s->wblocks));
406 s->blocks_w *
sizeof(*
s->map));
410 for (
int y = 0; y <
s->blocks_h; y++) {
415 for (
int x = 0; x <
s->blocks_w; x++) {
418 int orig_mv_x =
s->mvectors[mvpos].x;
419 int mv_x =
s->mvectors[mvpos].x / (1 + !
shift);
420 int mv_y =
s->mvectors[mvpos].y / (1 + !
shift);
421 int h =
s->avctx->coded_height >> !
shift;
422 int w =
s->avctx->coded_width >> !
shift;
425 if (orig_mv_x >= -32) {
426 if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 >
h ||
427 x * 8 + mv_x < 0 || x * 8 + mv_x + 8 >
w)
434 s->idsp.idct(
s->wblocks + x * 64);
435 for (
int i = 0;
i < 64;
i++)
436 s->wblocks[
i + x * 64] = (
s->wblocks[
i + x * 64] + 1) & 0xFFFC;
437 s->idsp.add_pixels_clamped(&
s->wblocks[x*64],
frame->data[
plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[
plane] + x * 8,
446 }
else if (
s->flags & 2) {
447 for (
int y = 0; y <
s->blocks_h; y++) {
448 for (
int x = 0; x <
s->blocks_w; x++) {
451 int orig_mv_x =
s->mvectors[mvpos].x;
452 int mv_x =
s->mvectors[mvpos].x / (1 + !
shift);
453 int mv_y =
s->mvectors[mvpos].y / (1 + !
shift);
454 int h =
s->avctx->coded_height >> !
shift;
455 int w =
s->avctx->coded_width >> !
shift;
462 if (orig_mv_x >= -32) {
463 if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 >
h ||
464 x * 8 + mv_x < 0 || x * 8 + mv_x + 8 >
w)
471 s->idsp.idct(
s->block);
472 for (
int i = 0;
i < 64;
i++)
473 s->block[
i] = (
s->block[
i] + 1) & 0xFFFC;
474 s->idsp.add_pixels_clamped(
s->block,
frame->data[
plane] + (
s->blocks_h - 1 - y) * 8 *
frame->linesize[
plane] + x * 8,
483 }
else if (
s->flags & 1) {
485 64 *
s->blocks_w *
sizeof(*
s->wblocks));
490 s->blocks_w *
sizeof(*
s->map));
494 for (
int y = 0; y <
s->blocks_h; y++) {
499 for (
int x = 0; x <
s->blocks_w; x++) {
507 for (
int y = 0; y <
s->blocks_h; y++) {
508 for (
int x = 0; x <
s->blocks_w; x++) {
535 double f = 1.0 - fabs(qscale);
537 if (!
s->key_frame && (
s->flags & 2)) {
539 for (
int i = 0;
i < 64;
i++) {
544 for (
int i = 0;
i < 64;
i++) {
545 luma[
i] =
FFMAX(1, 16 - qscale * 32);
551 for (
int i = 0;
i < 64;
i++) {
556 for (
int i = 0;
i < 64;
i++) {
563 for (
int i = 0;
i < 64;
i++) {
566 s->luma_quant_matrix[
i] = luma[pos] * ((pos / 8) & 1 ? -1 : 1);
567 s->chroma_quant_matrix[
i] =
chroma[pos] * ((pos / 8) & 1 ? -1 : 1);
579 for (
int y = 0; y < avctx->
height; y++) {
580 for (
int x = 0; x < avctx->
width; x++) {
581 dst[x*3+0] = bytestream2_get_byteu(gbyte) +
r;
583 dst[x*3+1] = bytestream2_get_byteu(gbyte) +
g;
585 dst[x*3+2] = bytestream2_get_byteu(gbyte) +
b;
588 dst -=
frame->linesize[0];
596 int ylinesize,
int ulinesize,
int vlinesize,
598 int *nx,
int *ny,
int *np,
int w,
int h)
604 int x = *nx, y = *ny, pos = *np;
607 y0dst[2*x+0] += fill[0];
608 y0dst[2*x+1] += fill[1];
609 y1dst[2*x+0] += fill[2];
610 y1dst[2*x+1] += fill[3];
612 }
else if (pos == 1) {
621 y0dst -= 2*ylinesize;
622 y1dst -= 2*ylinesize;
626 y0dst[2*x+0] += fill[2];
627 y0dst[2*x+1] += fill[3];
629 }
else if (pos == 2) {
630 y1dst[2*x+0] += fill[0];
631 y1dst[2*x+1] += fill[1];
640 y0dst -= 2*ylinesize;
641 y1dst -= 2*ylinesize;
662 int runlen, y = 0, x = 0;
667 code = bytestream2_peek_le32(gbyte);
668 runlen =
code & 0xFFFFFF;
670 if (
code >> 24 == 0x77) {
673 for (
int i = 0;
i < 4;
i++)
674 fill[
i] = bytestream2_get_byte(gbyte);
679 for (
int i = 0;
i < 4;
i++) {
682 if (x >=
frame->width * 3) {
685 dst -=
frame->linesize[0];
686 if (y >=
frame->height)
692 for (
int i = 0;
i < 4;
i++)
693 fill[
i] = bytestream2_get_byte(gbyte);
695 for (
int i = 0;
i < 4;
i++) {
698 if (x >=
frame->width * 3) {
701 dst -=
frame->linesize[0];
702 if (y >=
frame->height)
718 int runlen, y = 0, x = 0, pos = 0;
723 code = bytestream2_peek_le32(gbyte);
724 runlen =
code & 0xFFFFFF;
726 if (
code >> 24 == 0x77) {
729 for (
int i = 0;
i < 4;
i++)
730 fill[
i] = bytestream2_get_byte(gbyte);
745 for (
int i = 0;
i < 4;
i++)
746 fill[
i] = bytestream2_get_byte(gbyte);
768 uint8_t ly0 = 0, ly1 = 0, ly2 = 0, ly3 = 0, lu = 0, lv = 0;
770 for (
int y = 0; y < avctx->
height / 2; y++) {
771 for (
int x = 0; x < avctx->
width / 2; x++) {
772 y0dst[x*2+0] = bytestream2_get_byte(gbyte) + ly0;
774 y0dst[x*2+1] = bytestream2_get_byte(gbyte) + ly1;
776 y1dst[x*2+0] = bytestream2_get_byte(gbyte) + ly2;
778 y1dst[x*2+1] = bytestream2_get_byte(gbyte) + ly3;
780 udst[x] = bytestream2_get_byte(gbyte) + lu;
782 vdst[x] = bytestream2_get_byte(gbyte) + lv;
786 y0dst -= 2*
frame->linesize[0];
787 y1dst -= 2*
frame->linesize[0];
788 udst -=
frame->linesize[1];
789 vdst -=
frame->linesize[2];
837 nb_mvs *
sizeof(*
s->mvectors));
842 (
s->size[0] +
s->size[1] +
s->size[2]))) < 0)
845 memset(
s->mvectors, 0,
sizeof(*
s->mvectors) * nb_mvs);
847 for (
int i = 0;
i < nb_mvs;
i++) {
855 for (
int i = 0;
i < nb_mvs;
i++) {
920 if (idx < 256 && idx >= 0) {
922 }
else if (idx >= 0) {
930 int zlcount = 0, curlen, idx, nindex, last, llast;
931 int blcounts[32] = { 0 };
937 for (
int i = 0;
i < 256;
i++) {
938 int bitlen = bitlens[
i];
939 int blcount = blcounts[bitlen];
941 zlcount += bitlen < 1;
942 syms[(bitlen << 8) + blcount] =
i;
946 for (
int i = 0;
i < 512;
i++) {
951 for (
int i = 0;
i < 256;
i++) {
952 node_idx[
i] = 257 +
i;
960 for (curlen = 1; curlen < 32; curlen++) {
961 if (blcounts[curlen] > 0) {
962 int max_zlcount = zlcount + blcounts[curlen];
964 for (
int i = 0; zlcount < 256 && zlcount < max_zlcount; zlcount++,
i++) {
965 int p = node_idx[nindex - 1 + 512];
966 int ch = syms[256 * curlen +
i];
971 if (nodes[p].
child[0] == -1) {
986 p = node_idx[nindex - 1 + 512];
988 if (nodes[p].
child[0] == -1) {
1000 for (
int i = 0;
i < idx;
i++)
1001 node_idx[512 +
i] = old_idx[
i];
1015 uint32_t new_codes[256];
1018 uint32_t codes[256];
1025 for (
int i = 0;
i < 256;
i++) {
1027 bits[nb_codes] = bitlen[
i];
1028 codes[nb_codes] = new_codes[
i];
1029 symbols[nb_codes] =
i;
1055 if (
s->output_size > avctx->
width * avctx->
height * 9LL + 10000)
1071 for (
int i = 0;
i < 256;
i++) {
1076 for (
int i = 0;
i < 256;
i++)
1088 s->output[x++] =
val;
1102 unsigned compressed_size;
1111 header = bytestream2_get_le32(gbyte);
1112 s->fflags = bytestream2_get_le32(gbyte);
1113 s->bitstream_size =
s->fflags & 0x1FFFFFFF;
1116 if (avpkt->
size <
s->bitstream_size + 8)
1120 frame->key_frame =
s->key_frame;
1123 if (!
s->key_frame) {
1124 if (!
s->prev_frame->data[0]) {
1139 }
else if (!
s->dct) {
1145 w = bytestream2_get_le32(gbyte);
1146 h = bytestream2_get_le32(gbyte);
1147 if (
w == INT32_MIN ||
h == INT32_MIN)
1169 s->compression = bytestream2_get_le32(gbyte);
1170 if (
s->compression < 0 ||
s->compression > 100)
1173 for (
int i = 0;
i < 3;
i++)
1174 s->size[
i] = bytestream2_get_le32(gbyte);
1176 compressed_size =
s->output_size;
1179 compressed_size = avpkt->
size;
1182 if (
s->size[0] < 0 ||
s->size[1] < 0 ||
s->size[2] < 0 ||
1183 skip +
s->size[0] +
s->size[1] +
s->size[2] > compressed_size) {
1191 if (
frame->key_frame) {
1192 if (!
s->dct && !
s->rgb)
1194 else if (!
s->dct &&
s->rgb)
1200 s->prev_frame->height !=
frame->height)
1203 if (!(
s->flags & 2)) {
1211 }
else if (!
s->dct && !
s->rgb) {
1245 if (!
s->rgb && !
s->dct) {
1275 s->mvectors_size = 0;
1277 s->wblocks_size = 0;
1279 s->padded_output_size = 0;
static const uint8_t unscaled_chroma[64]
#define AV_LOG_WARNING
Something somehow does not look correct.
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
static av_cold int init(AVCodecContext *avctx)
AVS_FilterInfo AVS_Value child
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 double cb(void *priv, double x, double y)
#define u(width, name, range_min, range_max)
static av_cold int decode_init(AVCodecContext *avctx)
#define MKTAG(a, b, c, d)
static int decode_inter(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame, AVFrame *prev)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static int get_bits_count(const GetBitContext *s)
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.
unsigned padded_output_size
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
int chroma_quant_matrix[64]
static void copy_block8(uint8_t *dst, const uint8_t *src, ptrdiff_t dstStride, ptrdiff_t srcStride, int h)
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
int luma_quant_matrix[64]
static int decode_intra_blocks(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *dc_level)
static int decode_inter_block(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *map)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
static void decode_flush(AVCodecContext *avctx)
static void skip_bits(GetBitContext *s, int n)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int decode_huffman2(AVCodecContext *avctx, int header, int size)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static int read_code(GetBitContext *gb, int *oskip, int *level, int *map, int mode)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
static const uint8_t unscaled_luma[64]
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
void ff_free_vlc(VLC *vlc)
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static av_cold int decode_close(AVCodecContext *avctx)
static int decode_inter_plane(AGMContext *s, GetBitContext *gb, int size, const int *quant_matrix, AVFrame *frame, AVFrame *prev, int plane)
Describe the class of an AVClass context structure.
static void flush(AVCodecContext *avctx)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static int decode_runlen_rgb(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
@ AV_PICTURE_TYPE_I
Intra.
static int decode_motion_vectors(AVCodecContext *avctx, GetBitContext *gb)
int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static int decode_intra_block(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *dc_level)
#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 av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
static int decode_runlen(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
const char const char void * val
static const uint8_t header[24]
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
int flags
A combination of AV_PKT_FLAG values.
#define DECLARE_ALIGNED(n, t, v)
#define i(width, name, range_min, range_max)
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
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
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...
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_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
int idct_algo
IDCT algorithm, see FF_IDCT_* below.
const char * name
Name of the codec implementation.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
const uint8_t ff_zigzag_direct[64]
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 decode_intra_plane(AGMContext *s, GetBitContext *gb, int size, const int *quant_matrix, AVFrame *frame, int plane)
static const uint8_t * align_get_bits(GetBitContext *s)
main external API structure.
static int decode_inter_blocks(AGMContext *s, GetBitContext *gb, const int *quant_matrix, int *skip, int *map)
static int decode_raw_intra_rgb(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
static int build_huff(const uint8_t *bitlen, VLC *vlc)
static int shift(int a, int b)
int coded_width
Bitstream width / height, may be different from width/height e.g.
@ AV_PICTURE_TYPE_P
Predicted.
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 fill_pixels(uint8_t **y0, uint8_t **y1, uint8_t **u, uint8_t **v, int ylinesize, int ulinesize, int vlinesize, uint8_t *fill, int *nx, int *ny, int *np, int w, int h)
const VDPAUPixFmtMap * map
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
This structure stores compressed data.
int width
picture width / height.
static int decode_raw_intra(AVCodecContext *avctx, GetByteContext *gbyte, AVFrame *frame)
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
The exact code depends on how similar the blocks are and how related they are to the block
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int make_new_tree(const uint8_t *bitlens, uint32_t *codes)
static void get_tree_codes(uint32_t *codes, Node *nodes, int idx, uint32_t pfx, int bitpos)
static int decode_intra(AVCodecContext *avctx, GetBitContext *gb, AVFrame *frame)
static void compute_quant_matrix(AGMContext *s, double qscale)