35 #define TM2_ESCAPE 0x80000000 145 return FFMAX(ret, ret2);
166 if ((huff.
nodes <= 0) || (huff.
nodes > 0x10000)) {
168 "nodes: %i\n", huff.
nodes);
187 if (res >= 0 && res != huff.
max_bits) {
237 #define TM2_OLD_HEADER_MAGIC 0x00000100 238 #define TM2_NEW_HEADER_MAGIC 0x00000101 266 if ((d < 1) || (d >
TM2_DELTAS) || (mb < 1)) {
271 for (i = 0; i < d; i++) {
273 if (v & (1 << (mb - 1)))
279 ctx->
deltas[stream_id][i] = 0;
299 len = bytestream2_get_be32(&gb);
304 if (len >= INT_MAX / 4 - 1 || len < 0 || len * 4 + 4 > buf_size) {
310 toks = bytestream2_get_be32(&gb);
312 len = bytestream2_get_be32(&gb);
314 len = bytestream2_get_be32(&gb);
327 len = bytestream2_get_be32(&gb);
344 if ((toks < 0) || (toks > 0xFFFFFF)) {
355 len = bytestream2_get_be32(&gb);
363 for (i = 0; i < toks; i++) {
372 ctx->
tokens[stream_id][i], stream_id, i);
382 for (i = 0; i < toks; i++) {
386 ctx->
tokens[stream_id][i], stream_id, i);
420 #define TM2_INIT_POINTERS() \ 423 int Ystride, Ustride, Vstride;\ 425 Ystride = ctx->y_stride;\ 426 Vstride = ctx->uv_stride;\ 427 Ustride = ctx->uv_stride;\ 428 Y = (ctx->cur?ctx->Y2:ctx->Y1) + by * 4 * Ystride + bx * 4;\ 429 V = (ctx->cur?ctx->V2:ctx->V1) + by * 2 * Vstride + bx * 2;\ 430 U = (ctx->cur?ctx->U2:ctx->U1) + by * 2 * Ustride + bx * 2;\ 431 last = ctx->last + bx * 4;\ 432 clast = ctx->clast + bx * 4; 434 #define TM2_INIT_POINTERS_2() \ 435 unsigned *Yo, *Uo, *Vo;\ 436 int oYstride, oUstride, oVstride;\ 438 TM2_INIT_POINTERS();\ 442 Yo = (ctx->cur?ctx->Y1:ctx->Y2) + by * 4 * oYstride + bx * 4;\ 443 Vo = (ctx->cur?ctx->V1:ctx->V2) + by * 2 * oVstride + bx * 2;\ 444 Uo = (ctx->cur?ctx->U1:ctx->U2) + by * 2 * oUstride + bx * 2; 447 #define TM2_RECALC_BLOCK(CHR, stride, last, CD) {\ 448 CD[0] = (unsigned)CHR[ 1] - (unsigned)last[1];\ 449 CD[1] = (unsigned)CHR[stride + 1] - (unsigned) CHR[1];\ 450 last[0] = (int)CHR[stride + 0];\ 451 last[1] = (int)CHR[stride + 1];} 459 for (j = 0; j < 4; j++){
461 for (i = 0; i < 4; i++){
462 d = deltas[i + j * 4];
465 Y[
i] = av_clip_uint8(last[i]);
475 for (j = 0; j < 2; j++) {
476 for (i = 0; i < 2; i++) {
477 CD[j] += deltas[i + j * 2];
495 t = (
int)(CD[0] + CD[1]) >> 1;
496 l = (
int)(prev - CD[0] - CD[1] + clast[1]) >> 1;
497 CD[1] = CD[0] + CD[1] - t;
511 for (i = 0; i < 4; i++) {
519 for (i = 0; i < 16; i++)
533 deltas[1] = deltas[2] = deltas[3] = 0;
537 deltas[1] = deltas[2] = deltas[3] = 0;
541 for (i = 0; i < 16; i++)
556 deltas[1] = deltas[2] = deltas[3] = 0;
560 deltas[1] = deltas[2] = deltas[3] = 0;
564 for (i = 0; i < 16; i++)
573 last[0] = (
int)((
unsigned)
last[-1] - ctx->
D[0] - ctx->
D[1] - ctx->
D[2] - ctx->
D[3] +
last[1]) >> 1;
575 last[0] = (
int)((
unsigned)
last[1] - ctx->
D[0] - ctx->
D[1] - ctx->
D[2] - ctx->
D[3])>> 1;
578 t1 = ctx->
D[0] + (unsigned)ctx->
D[1];
580 ctx->
D[1] = t1 - (t1 >> 1);
581 t2 = ctx->
D[2] + (unsigned)ctx->
D[3];
583 ctx->
D[3] = t2 - (t2 >> 1);
592 unsigned left, right;
598 deltas[0] = deltas[1] = deltas[2] = deltas[3] = 0;
601 deltas[0] = deltas[1] = deltas[2] = deltas[3] = 0;
605 for (i = 0; i < 16; i++)
608 ct = (unsigned)ctx->
D[0] + ctx->
D[1] + ctx->
D[2] + ctx->
D[3];
611 left =
last[-1] - (unsigned)ct;
617 last[0] = left + (diff >> 2);
618 last[1] = left + (diff >> 1);
619 last[2] = right - (diff >> 2);
624 ctx->
D[0] = (tp + (ct >> 2)) -
left;
626 ctx->
D[1] = (tp + (ct >> 1)) -
left;
628 ctx->
D[2] = ((tp + ct) - (ct >> 2)) - left;
630 ctx->
D[3] = (tp + ct) - left;
641 for (j = 0; j < 2; j++) {
642 for (i = 0; i < 2; i++){
646 U += Ustride;
V += Vstride;
647 Uo += oUstride; Vo += oVstride;
655 ctx->
D[0] = Yo[3] -
last[3];
656 ctx->
D[1] = Yo[3 + oYstride] - Yo[3];
657 ctx->
D[2] = Yo[3 + oYstride * 2] - Yo[3 + oYstride];
658 ctx->
D[3] = Yo[3 + oYstride * 3] - Yo[3 + oYstride * 2];
660 for (j = 0; j < 4; j++) {
661 for (i = 0; i < 4; i++) {
677 for (j = 0; j < 2; j++) {
678 for (i = 0; i < 2; i++) {
693 ctx->
D[0] = Yo[3] -
last[3];
694 ctx->
D[1] = Yo[3 + oYstride] - Yo[3];
695 ctx->
D[2] = Yo[3 + oYstride * 2] - Yo[3 + oYstride];
696 ctx->
D[3] = Yo[3 + oYstride * 3] - Yo[3 + oYstride * 2];
698 for (j = 0; j < 4; j++) {
700 for (i = 0; i < 4; i++) {
704 ctx->
D[j] = last[3] - d;
718 mx = av_clip(mx, -(bx * 4 + 4), ctx->
avctx->
width - bx * 4);
719 my = av_clip(my, -(by * 4 + 4), ctx->
avctx->
height - by * 4);
726 Yo += my * oYstride + mx;
727 Uo += (my >> 1) * oUstride + (mx >> 1);
728 Vo += (my >> 1) * oVstride + (mx >> 1);
731 for (j = 0; j < 2; j++) {
732 for (i = 0; i < 2; i++) {
747 for (j = 0; j < 4; j++) {
748 for (i = 0; i < 4; i++) {
756 ctx->
D[0] = (unsigned)
Y[3] -
last[3];
757 ctx->
D[1] = (unsigned)
Y[3 + Ystride] -
Y[3];
758 ctx->
D[2] = (unsigned)
Y[3 + Ystride * 2] -
Y[3 + Ystride];
759 ctx->
D[3] = (unsigned)
Y[3 + Ystride * 3] -
Y[3 + Ystride * 2];
760 for (i = 0; i < 4; i++)
761 last[i] =
Y[i + Ystride * 3];
781 memset(ctx->
last, 0, 4 * bw *
sizeof(
int));
782 memset(ctx->
clast, 0, 4 * bw *
sizeof(
int));
784 for (j = 0; j < bh; j++) {
785 memset(ctx->
D, 0, 4 *
sizeof(
int));
786 memset(ctx->
CD, 0, 4 *
sizeof(
int));
787 for (i = 0; i < bw; i++) {
823 Y = (ctx->
cur?ctx->
Y2:ctx->
Y1);
824 U = (ctx->
cur?ctx->
U2:ctx->
U1);
825 V = (ctx->
cur?ctx->
V2:ctx->
V1);
827 for (j = 0; j <
h; j++) {
828 for (i = 0; i <
w; i++) {
829 unsigned y = Y[
i],
u = U[i >> 1], v = V[i >> 1];
830 dst[3*i+0] = av_clip_uint8(y + v);
831 dst[3*i+1] = av_clip_uint8(y);
832 dst[3*i+2] = av_clip_uint8(y + u);
836 Y[-4] = Y[-3] = Y[-2] = Y[-1] = Y[0];
837 Y[w + 3] = Y[w + 2] = Y[w + 1] = Y[
w] = Y[w - 1];
845 }
else if (j == h - 1) {
855 U[-2] = U[-1] = U[0];
856 V[-2] = V[-1] = V[0];
857 U[cw + 1] = U[cw] = U[cw - 1];
858 V[cw + 1] = V[cw] = V[cw - 1];
866 }
else if (j == h - 1) {
886 #define TM2_HEADER_SIZE 40 889 void *
data,
int *got_frame,
894 int buf_size = avpkt->
size & ~3;
918 if (offset >= buf_size) {
943 return (ret < 0) ? ret : buf_size;
977 l->
Y2 = l->
Y1 + w *
h;
985 l->
U2 = l->
U1 + w *
h;
986 l->
V1 = l->
U2 + w *
h;
987 l->
V2 = l->
V1 + w *
h;
1012 .
name =
"truemotion2",
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static av_cold int init(AVCodecContext *avctx)
#define avpriv_request_sample(...)
int * recode
table for converting from code indexes to values
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
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...
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
AVCodec ff_truemotion2_decoder
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
void * av_calloc(size_t nmemb, size_t size)
Non-inlined equivalent of av_mallocz_array().
int num
current number filled
static int tm2_read_header(TM2Context *ctx, const uint8_t *buf)
structure for gathering Huffman codes information
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
void(* bswap_buf)(uint32_t *dst, const uint32_t *src, int 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 offset
static const int tm2_stream_order[TM2_NUM_STREAMS]
static av_cold int end(AVCodecContext *avctx)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
int max_bits
maximum length of code
#define u(width, name, range_min, range_max)
static int tm2_read_deltas(TM2Context *ctx, int stream_id)
static void tm2_free_codes(TM2Codes *code)
int min_bits
minimum length of code
static int get_bits_count(const GetBitContext *s)
VLC vlc
table for FFmpeg bitstream reader
bitstream reader API header.
static void tm2_hi_res_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, int buf_size)
static void tm2_update_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
static int get_bits_left(GetBitContext *gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int val_bits
length of literal
static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
static void tm2_low_res_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static int tm2_decode_blocks(TM2Context *ctx, AVFrame *p)
int * tokens[TM2_NUM_STREAMS]
const char * name
Name of the codec implementation.
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array through a pointer to a pointer.
int max_num
total number of codes
enum AVPictureType pict_type
Picture type of the frame.
static int GET_TOK(TM2Context *ctx, int type)
int width
picture width / height.
#define TM2_OLD_HEADER_MAGIC
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
packed RGB 8:8:8, 24bpp, BGRBGR...
static int tm2_get_token(GetBitContext *gb, TM2Codes *code)
static int tm2_read_tree(TM2Context *ctx, int length, TM2Huff *huff)
uint8_t * lens
codelengths
int nodes
total number of nodes in tree
static av_cold int decode_end(AVCodecContext *avctx)
static av_always_inline int bytestream2_tell(GetByteContext *g)
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
#define TM2_INIT_POINTERS_2()
static void tm2_low_chroma(int *data, int stride, int *clast, unsigned *CD, int *deltas, int bx)
main external API structure.
static void tm2_still_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
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
static unsigned int get_bits1(GetBitContext *s)
#define TM2_INIT_POINTERS()
int ff_init_vlc_from_lengths(VLC *vlc_arg, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags, void *logctx)
Build VLC decoding tables suitable for use with get_vlc2()
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static void tm2_med_res_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
static void tm2_motion_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
static void tm2_apply_deltas(TM2Context *ctx, int *Y, int stride, int *deltas, int *last)
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
#define TM2_RECALC_BLOCK(CHR, stride, last, CD)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
GLint GLenum GLboolean GLsizei stride
common internal api header.
static void tm2_null_res_block(TM2Context *ctx, AVFrame *pic, int bx, int by)
int deltas[TM2_NUM_STREAMS][TM2_DELTAS]
static av_cold int decode_init(AVCodecContext *avctx)
static void tm2_high_chroma(int *data, int stride, int *last, unsigned *CD, int *deltas)
#define TM2_NEW_HEADER_MAGIC
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
VLC_TYPE(* table)[2]
code, bits
int tok_lens[TM2_NUM_STREAMS]
int key_frame
1 -> keyframe, 0-> not
Huffman codes for each of streams.
#define av_malloc_array(a, b)
int tok_ptrs[TM2_NUM_STREAMS]
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
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static double val(void *priv, double ch)
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)