FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
libuavs3d.c
Go to the documentation of this file.
1 /*
2  * AVS3-P2/IEEE1857.10 video decoder (using the uavs3d library)
3  * Copyright (c) 2020 Zhenyu Wang <wangzhenyu@pkusz.edu.cn>
4  * Bingjie Han <hanbj@pkusz.edu.cn>
5  * Huiwen Ren <hwrenx@gmail.com>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "libavutil/avutil.h"
25 #include "libavutil/common.h"
26 #include "libavutil/cpu.h"
27 #include "libavutil/imgutils.h"
28 #include "libavutil/intreadwrite.h"
29 #include "libavutil/opt.h"
30 #include "avcodec.h"
31 #include "avs3.h"
32 #include "codec_internal.h"
33 #include "decode.h"
34 #include "uavs3d.h"
35 
36 typedef struct uavs3d_context {
38  void *dec_handle;
41  uavs3d_io_frm_t dec_frame;
43 
44 #define UAVS3D_CHECK_START_CODE(data_ptr, PIC_START_CODE) \
45  (AV_RL32(data_ptr) != (PIC_START_CODE << 24) + AVS3_NAL_START_CODE)
46 static int uavs3d_find_next_start_code(const unsigned char *bs_data, int bs_len, int *left)
47 {
48  const unsigned char *data_ptr = bs_data + 4;
49  int count = bs_len - 4;
50 
51  while (count >= 4 &&
57  data_ptr++;
58  count--;
59  }
60 
61  if (count >= 4) {
62  *left = count;
63  return 1;
64  }
65 
66  return 0;
67 }
68 
69 static void uavs3d_output_callback(uavs3d_io_frm_t *dec_frame) {
70  uavs3d_io_frm_t frm_out;
71  AVFrame *frm = (AVFrame *)dec_frame->priv;
72  int i;
73 
74  if (!frm || !frm->data[0]) {
75  dec_frame->got_pic = 0;
76  av_log(NULL, AV_LOG_ERROR, "Invalid AVFrame in uavs3d output.\n");
77  return;
78  }
79 
80  frm->pts = dec_frame->pts;
81  frm->pkt_dts = dec_frame->dts;
82 #if FF_API_FRAME_PKT
84  frm->pkt_pos = dec_frame->pkt_pos;
85  frm->pkt_size = dec_frame->pkt_size;
87 #endif
88 
89  if (dec_frame->type < 0 || dec_frame->type >= FF_ARRAY_ELEMS(ff_avs3_image_type)) {
90  av_log(NULL, AV_LOG_WARNING, "Error frame type in uavs3d: %d.\n", dec_frame->type);
91  } else {
92  frm->pict_type = ff_avs3_image_type[dec_frame->type];
93  if (frm->pict_type == AV_PICTURE_TYPE_I)
94  frm->flags |= AV_FRAME_FLAG_KEY;
95  else
96  frm->flags &= ~AV_FRAME_FLAG_KEY;
97  }
98 
99  for (i = 0; i < 3; i++) {
100  frm_out.width [i] = dec_frame->width[i];
101  frm_out.height[i] = dec_frame->height[i];
102  frm_out.stride[i] = frm->linesize[i];
103  frm_out.buffer[i] = frm->data[i];
104  }
105 
106  uavs3d_img_cpy_cvt(&frm_out, dec_frame, dec_frame->bit_depth);
107 }
108 
109 #define UAVS3D_CHECK_INVALID_RANGE(v, l, r) ((v)<(l)||(v)>(r))
110 
112 {
113  uavs3d_context *h = avctx->priv_data;
114  uavs3d_io_frm_t *frm_dec = &h->dec_frame;
115  struct uavs3d_com_seqh_t *seqh = frm_dec->seqhdr;
116  int ret;
117 
118  if (UAVS3D_CHECK_INVALID_RANGE(seqh->frame_rate_code, 0, 15)) {
119  av_log(avctx, AV_LOG_ERROR, "Invalid frame rate code: %d.\n", seqh->frame_rate_code);
120  seqh->frame_rate_code = 3; // default 25 fps
121  } else {
122  avctx->framerate.num = ff_avs3_frame_rate_tab[seqh->frame_rate_code].num;
123  avctx->framerate.den = ff_avs3_frame_rate_tab[seqh->frame_rate_code].den;
124  }
125  avctx->has_b_frames = seqh->output_reorder_delay;
126  avctx->pix_fmt = seqh->bit_depth_internal == 8 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUV420P10LE;
127  ret = ff_set_dimensions(avctx, seqh->horizontal_size, seqh->vertical_size);
128  if (ret < 0)
129  return ret;
130  h->got_seqhdr = 1;
131 
132  if (seqh->colour_description) {
133  if (UAVS3D_CHECK_INVALID_RANGE(seqh->colour_primaries, 0, 9) ||
134  UAVS3D_CHECK_INVALID_RANGE(seqh->transfer_characteristics, 0, 14) ||
135  UAVS3D_CHECK_INVALID_RANGE(seqh->matrix_coefficients, 0, 11)) {
136  av_log(avctx, AV_LOG_ERROR,
137  "Invalid colour description: primaries: %d"
138  "transfer characteristics: %d"
139  "matrix coefficients: %d.\n",
140  seqh->colour_primaries,
141  seqh->transfer_characteristics,
142  seqh->matrix_coefficients);
143  } else {
144  avctx->color_primaries = ff_avs3_color_primaries_tab[seqh->colour_primaries];
145  avctx->color_trc = ff_avs3_color_transfer_tab [seqh->transfer_characteristics];
146  avctx->colorspace = ff_avs3_color_matrix_tab [seqh->matrix_coefficients];
147  }
148  }
149 
150  return 0;
151 }
152 
154 {
155  uavs3d_context *h = avctx->priv_data;
156  uint8_t *header = avctx->extradata;
157  int header_size = avctx->extradata_size;
158  uavs3d_io_frm_t *frm_dec = &h->dec_frame;
159 
160  if (avctx->extradata_size < 4) {
161  av_log(avctx, AV_LOG_WARNING, "Invalid extradata size %d\n",
162  avctx->extradata_size);
163  return 0;
164  }
165 
166  if (header[0] == 1) {
167  // Skip configurationVersion and sequence_header_length
168  header += 3;
169  // Also remove library_dependency_idc at the end
170  header_size -= 4;
171  }
172 
173  frm_dec->nal_type = 0;
174  frm_dec->pkt_pos = 0;
175  frm_dec->pkt_size = header_size;
176  frm_dec->bs = header;
177  frm_dec->bs_len = header_size;
178  frm_dec->pts = 0;
179  frm_dec->dts = 0;
180  uavs3d_decode(h->dec_handle, frm_dec);
181  if (frm_dec->nal_type == NAL_SEQ_HEADER) {
182  int ret = libuavs3d_on_seq_header(avctx);
183  if (ret < 0)
184  av_log(avctx, AV_LOG_WARNING,
185  "Process sequence header failed, %s\n", av_err2str(ret));
186  } else {
187  av_log(avctx, AV_LOG_WARNING,
188  "Missing sequence header in extradata\n");
189  }
190 
191  return 0;
192 }
193 
195 {
196  uavs3d_context *h = avctx->priv_data;
197  uavs3d_cfg_t cdsc;
198 
199  cdsc.frm_threads = avctx->thread_count > 0 ? avctx->thread_count : av_cpu_count();
200  cdsc.check_md5 = 0;
201  h->dec_handle = uavs3d_create(&cdsc, uavs3d_output_callback, NULL);
202  h->got_seqhdr = 0;
203 
204  if (!h->dec_handle) {
205  return AVERROR(ENOMEM);
206  }
207 
208  if (avctx->extradata)
209  return libuavs3d_decode_extradata(avctx);
210 
211  return 0;
212 }
213 
215 {
216  uavs3d_context *h = avctx->priv_data;
217 
218  if (h->dec_handle) {
219  uavs3d_flush(h->dec_handle, NULL);
220  uavs3d_delete(h->dec_handle);
221  h->dec_handle = NULL;
222  }
223  h->got_seqhdr = 0;
224 
225  return 0;
226 }
227 
228 static void libuavs3d_flush(AVCodecContext * avctx)
229 {
230  uavs3d_context *h = avctx->priv_data;
231 
232  if (h->dec_handle) {
233  uavs3d_reset(h->dec_handle);
234  }
235 }
236 
238  int *got_frame, AVPacket *avpkt)
239 {
240  uavs3d_context *h = avctx->priv_data;
241  const uint8_t *buf = avpkt->data;
242  int buf_size = avpkt->size;
243  const uint8_t *buf_end;
244  const uint8_t *buf_ptr = buf;
245  int left_bytes;
246  int ret, finish = 0;
247 
248  *got_frame = 0;
249  frm->pts = -1;
251 
252  if (!buf_size) {
253  if (h->got_seqhdr) {
254  if (!frm->data[0] && (ret = ff_get_buffer(avctx, frm, 0)) < 0) {
255  return ret;
256  }
257  h->dec_frame.priv = frm; // AVFrame
258  }
259  do {
260  ret = uavs3d_flush(h->dec_handle, &h->dec_frame);
261  } while (ret > 0 && !h->dec_frame.got_pic);
262  } else {
263  uavs3d_io_frm_t *frm_dec = &h->dec_frame;
264 
265  buf_end = buf + buf_size;
266 #if FF_API_FRAME_PKT
268  frm_dec->pkt_pos = avpkt->pos;
269  frm_dec->pkt_size = avpkt->size;
271 #endif
272 
273  while (!finish) {
274  int bs_len;
275 
276  if (h->got_seqhdr) {
277  if (!frm->data[0] && (ret = ff_get_buffer(avctx, frm, 0)) < 0) {
278  return ret;
279  }
280  h->dec_frame.priv = frm; // AVFrame
281  }
282 
283  if (uavs3d_find_next_start_code(buf_ptr, buf_end - buf_ptr, &left_bytes)) {
284  bs_len = buf_end - buf_ptr - left_bytes;
285  } else {
286  bs_len = buf_end - buf_ptr;
287  finish = 1;
288  }
289  frm_dec->bs = (unsigned char *)buf_ptr;
290  frm_dec->bs_len = bs_len;
291  frm_dec->pts = avpkt->pts;
292  frm_dec->dts = avpkt->dts;
293  uavs3d_decode(h->dec_handle, frm_dec);
294  buf_ptr += bs_len;
295 
296  if (frm_dec->nal_type == NAL_SEQ_HEADER) {
297  ret = libuavs3d_on_seq_header(avctx);
298  if (ret < 0)
299  return ret;
300  }
301  if (frm_dec->got_pic) {
302  break;
303  }
304  }
305  }
306 
307  *got_frame = h->dec_frame.got_pic;
308 
309  if (!(*got_frame)) {
310  av_frame_unref(frm);
311  }
312 
313  return buf_ptr - buf;
314 }
315 
317  .p.name = "libuavs3d",
318  CODEC_LONG_NAME("libuavs3d AVS3-P2/IEEE1857.10"),
319  .p.type = AVMEDIA_TYPE_VIDEO,
320  .p.id = AV_CODEC_ID_AVS3,
321  .priv_data_size = sizeof(uavs3d_context),
322  .init = libuavs3d_init,
323  .close = libuavs3d_end,
326  .caps_internal = FF_CODEC_CAP_NOT_INIT_THREADSAFE |
328  .flush = libuavs3d_flush,
329  .p.wrapper_name = "libuavs3d",
330 };
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
libuavs3d_decode_extradata
static int libuavs3d_decode_extradata(AVCodecContext *avctx)
Definition: libuavs3d.c:153
AVERROR
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
opt.h
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:699
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:522
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:692
uavs3d_context::dec_frame
uavs3d_io_frm_t dec_frame
Definition: libuavs3d.c:41
AVPacket::data
uint8_t * data
Definition: packet.h:539
UAVS3D_CHECK_INVALID_RANGE
#define UAVS3D_CHECK_INVALID_RANGE(v, l, r)
Definition: libuavs3d.c:109
FF_CODEC_CAP_NOT_INIT_THREADSAFE
#define FF_CODEC_CAP_NOT_INIT_THREADSAFE
The codec is not known to be init-threadsafe (i.e.
Definition: codec_internal.h:34
uavs3d_output_callback
static void uavs3d_output_callback(uavs3d_io_frm_t *dec_frame)
Definition: libuavs3d.c:69
FFCodec
Definition: codec_internal.h:127
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:690
ff_set_dimensions
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.
Definition: utils.c:91
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
AVCodecContext::framerate
AVRational framerate
Definition: avcodec.h:574
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
finish
static void finish(void)
Definition: movenc.c:374
uavs3d_context::got_seqhdr
int got_seqhdr
Definition: libuavs3d.c:40
libuavs3d_decode_frame
static int libuavs3d_decode_frame(AVCodecContext *avctx, AVFrame *frm, int *got_frame, AVPacket *avpkt)
Definition: libuavs3d.c:237
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1601
uavs3d_context
Definition: libuavs3d.c:36
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_PIX_FMT_YUV420P10LE
@ AV_PIX_FMT_YUV420P10LE
planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian
Definition: pixfmt.h:156
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:685
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:661
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:538
AVCodecContext::has_b_frames
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition: avcodec.h:737
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:341
intreadwrite.h
AVS3_INTRA_PIC_START_CODE
#define AVS3_INTRA_PIC_START_CODE
Definition: avs3.h:30
AV_CODEC_CAP_OTHER_THREADS
#define AV_CODEC_CAP_OTHER_THREADS
Codec supports multithreading through a method other than slice- or frame-level multithreading.
Definition: codec.h:124
decode.h
AVFrame::pkt_size
attribute_deprecated int pkt_size
size of the corresponding packet containing the compressed frame.
Definition: frame.h:762
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
if
if(ret)
Definition: filter_design.txt:179
AV_CODEC_ID_AVS3
@ AV_CODEC_ID_AVS3
Definition: codec_id.h:250
libuavs3d_flush
static void libuavs3d_flush(AVCodecContext *avctx)
Definition: libuavs3d.c:228
ff_avs3_color_matrix_tab
static const int ff_avs3_color_matrix_tab[12]
Definition: avs3.h:96
NULL
#define NULL
Definition: coverity.c:32
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
AVFrame::pkt_dts
int64_t pkt_dts
DTS copied from the AVPacket that triggered returning this frame.
Definition: frame.h:529
uavs3d_context::frame_threads
int frame_threads
Definition: libuavs3d.c:39
ff_avs3_color_primaries_tab
static const int ff_avs3_color_primaries_tab[10]
Definition: avs3.h:65
av_cpu_count
int av_cpu_count(void)
Definition: cpu.c:221
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1703
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:512
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:540
codec_internal.h
cpu.h
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
AVFrame::pkt_pos
attribute_deprecated int64_t pkt_pos
reordered pos from the last AVPacket that has been input into the decoder
Definition: frame.h:728
ff_avs3_frame_rate_tab
static const AVRational ff_avs3_frame_rate_tab[16]
Definition: avs3.h:46
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:278
header
static const uint8_t header[24]
Definition: sdr2.c:68
ff_avs3_image_type
static enum AVPictureType ff_avs3_image_type[4]
Definition: avs3.h:111
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:538
uavs3d_context::dec_handle
void * dec_handle
Definition: libuavs3d.c:38
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:532
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:537
common.h
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:530
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:671
avcodec.h
ff_avs3_color_transfer_tab
static const int ff_avs3_color_transfer_tab[15]
Definition: avs3.h:78
ret
ret
Definition: filter_design.txt:187
AVS3_SEQ_START_CODE
#define AVS3_SEQ_START_CODE
Definition: avs3.h:27
left
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
Definition: snow.txt:386
AVCodecContext
main external API structure.
Definition: avcodec.h:451
AVRational::den
int den
Denominator.
Definition: rational.h:60
avs3.h
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
UAVS3D_CHECK_START_CODE
#define UAVS3D_CHECK_START_CODE(data_ptr, PIC_START_CODE)
Definition: libuavs3d.c:44
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
avutil.h
uavs3d_find_next_start_code
static int uavs3d_find_next_start_code(const unsigned char *bs_data, int bs_len, int *left)
Definition: libuavs3d.c:46
FF_CODEC_CAP_AUTO_THREADS
#define FF_CODEC_CAP_AUTO_THREADS
Codec handles avctx->thread_count == 0 (auto) internally.
Definition: codec_internal.h:72
libuavs3d_init
static av_cold int libuavs3d_init(AVCodecContext *avctx)
Definition: libuavs3d.c:194
AVS3_SEQ_END_CODE
#define AVS3_SEQ_END_CODE
Definition: avs3.h:28
AVPacket
This structure stores compressed data.
Definition: packet.h:516
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:478
AVPacket::pos
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:559
ff_libuavs3d_decoder
const FFCodec ff_libuavs3d_decoder
Definition: libuavs3d.c:316
imgutils.h
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:455
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
h
h
Definition: vp9dsp_template.c:2070
AVS3_FIRST_SLICE_START_CODE
#define AVS3_FIRST_SLICE_START_CODE
Definition: avs3.h:35
AVS3_INTER_PIC_START_CODE
#define AVS3_INTER_PIC_START_CODE
Definition: avs3.h:33
uavs3d_context::avctx
AVCodecContext * avctx
Definition: libuavs3d.c:37
libuavs3d_on_seq_header
static int libuavs3d_on_seq_header(AVCodecContext *avctx)
Definition: libuavs3d.c:111
libuavs3d_end
static av_cold int libuavs3d_end(AVCodecContext *avctx)
Definition: libuavs3d.c:214