FFmpeg: libavcodec/mss2.c Source File
Go to the documentation of this file. 1 /*
2 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 /**
22 * @file
23 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
24 */
25
37
46
48 {
49 while ((
c->high >> 15) - (
c->low >> 15) < 2) {
50 if ((
c->low ^
c->high) & 0x10000) {
54 }
55 c->high = (uint16_t)
c->high << 8 | 0xFF;
56 c->value = (uint16_t)
c->value << 8 | bytestream2_get_byte(
c->gbc.gB);
57 c->low = (uint16_t)
c->low << 8;
58 }
59 }
60
62
63 /* L. Stuiver and A. Moffat: "Piecewise Integer Mapping for Arithmetic Coding."
64 * In Proc. 8th Data Compression Conference (DCC '98), pp. 3-12, Mar. 1998 */
65
67 {
69
72 else
74 }
75
77 int low, int high, int n)
78 {
80
83 else
85
86 c->high +=
c->low - 1;
87
90 else
92 }
93
95 {
96 int range =
c->high -
c->low + 1;
99
102
104
106
108
110
112 }
113
115 {
116 int range =
c->high -
c->low + 1, n = *probs;
119
122
124
126 while (probs[++
i] >
val) ;
127
130
132 }
133
135
137 {
138 int diff = (
c->high >> 16) - (
c->low >> 16);
141
142 while (!(
diff & 0x80)) {
145 }
146
147 return (
bits + bp + 7 >> 3) + ((
c->low >> 16) + 1 ==
c->high >> 16);
148 }
149
151 {
154 c->value = bytestream2_get_be24(gB);
157 c->get_model_sym = arith2_get_model_sym;
159 }
160
162 {
164 uint32_t *pal =
ctx->pal + 256 -
ctx->free_colours;
165
166 if (!
ctx->free_colours)
167 return 0;
168
169 ncol = *buf++;
170 if (ncol >
ctx->free_colours || buf_size < 2 + ncol * 3)
172 for (
i = 0;
i < ncol;
i++)
174
175 return 1 + ncol * 3;
176 }
177
179 int keyframe,
int w,
int h)
180 {
181 int last_symbol = 0, repeat = 0, prev_avail = 0;
182
183 if (!keyframe) {
184 int x, y, endx, endy, t;
185
186 #define READ_PAIR(a, b) \
187 a = bytestream2_get_byte(gB) << 4; \
188 t = bytestream2_get_byte(gB); \
189 a |= t >> 4; \
190 b = (t & 0xF) << 8; \
191 b |= bytestream2_get_byte(gB); \
192
195
196 if (endx >=
w || endy >=
h || x > endx || y > endy)
201 if (y)
202 prev_avail = 1;
203 }
204
205 do {
206 uint16_t *p = dst;
207 do {
208 if (repeat-- < 1) {
209 int b = bytestream2_get_byte(gB);
211 last_symbol =
b << 8 | bytestream2_get_byte(gB);
213 repeat = 0;
215 if (repeat >= (INT_MAX >> 8) - 1) {
218 }
219 repeat = (repeat << 8) + bytestream2_get_byte(gB) + 1;
220 }
221 if (last_symbol == -2) {
222 int skip =
FFMIN((
unsigned)repeat, dst +
w - p);
225 }
226 } else
227 last_symbol = 127 -
b;
228 }
229 if (last_symbol >= 0)
230 *p = last_symbol;
231 else if (last_symbol == -1 && prev_avail)
233 }
while (++p < dst +
w);
235 prev_avail = 1;
237
238 return 0;
239 }
240
242 uint8_t *rgb_dst, ptrdiff_t rgb_stride, uint32_t *pal,
243 int keyframe,
int kf_slipt,
int slice,
int w,
int h)
244 {
245 uint8_t
bits[270] = { 0 };
246 uint32_t codes[270];
248
249 int current_length = 0, read_codes = 0, next_code = 0, current_codes = 0;
250 int remaining_codes, surplus_codes,
i;
251
252 const int alphabet_size = 270 - keyframe;
253
254 int last_symbol = 0, repeat = 0, prev_avail = 0;
255
256 if (!keyframe) {
257 int x, y, clipw, cliph;
258
263
264 if (x + clipw >
w || y + cliph >
h)
266 pal_dst += pal_stride * y + x;
267 rgb_dst += rgb_stride * y + x * 3;
270 if (y)
271 prev_avail = 1;
272 } else {
273 if (slice > 0) {
274 pal_dst += pal_stride * kf_slipt;
275 rgb_dst += rgb_stride * kf_slipt;
276 prev_avail = 1;
278 } else
280 }
281
282 /* read explicit codes */
283 do {
284 while (current_codes--) {
286 if (symbol >= 204 - keyframe)
287 symbol += 14 - keyframe;
288 else if (symbol > 189)
289 symbol =
get_bits1(gb) + (symbol << 1) - 190;
292 bits[symbol] = current_length;
293 codes[symbol] = next_code++;
294 read_codes++;
295 }
296 current_length++;
297 next_code <<= 1;
298 remaining_codes = (1 << current_length) - next_code;
300 if (current_length > 22 || current_codes > remaining_codes)
302 } while (current_codes != remaining_codes);
303
304 remaining_codes = alphabet_size - read_codes;
305
306 /* determine the minimum length to fit the rest of the alphabet */
307 while ((surplus_codes = (2 << current_length) -
308 (next_code << 1) - remaining_codes) < 0) {
309 current_length++;
310 next_code <<= 1;
311 }
312
313 /* add the rest of the symbols lexicographically */
314 for (
i = 0;
i < alphabet_size;
i++)
316 if (surplus_codes-- == 0) {
317 current_length++;
318 next_code <<= 1;
319 }
320 bits[
i] = current_length;
321 codes[
i] = next_code++;
322 }
323
324 if (next_code != 1 << current_length)
326
327 if ((
i =
vlc_init(&vlc, 9, alphabet_size,
bits, 1, 1, codes, 4, 4, 0)) < 0)
329
330 /* frame decode */
331 do {
332 uint8_t *pp = pal_dst;
333 uint8_t *rp = rgb_dst;
334 do {
335 if (repeat-- < 1) {
343
345 repeat = 0;
346 else
348
349 repeat += (1 <<
b) - 1;
350
351 if (last_symbol == -2) {
356 }
357 } else
358 last_symbol = 267 -
b;
359 }
360 if (last_symbol >= 0) {
361 *pp = last_symbol;
363 } else if (last_symbol == -1 && prev_avail) {
364 *pp = *(pp - pal_stride);
365 memcpy(rp, rp - rgb_stride, 3);
366 }
367 rp += 3;
368 }
while (++pp < pal_dst +
w);
369 pal_dst += pal_stride;
370 rgb_dst += rgb_stride;
371 prev_avail = 1;
373
375 return 0;
376 }
377
379 int x,
int y,
int w,
int h,
int wmv9_mask)
380 {
387
389
392
394
398 }
399
403 }
404
406
411 }
412
414
416 s->end_mb_y = (
h + 15) >> 4;
420 s->end_mb_y =
s->end_mb_y + 1 >> 1;
421
423
424 if (v->
end_mb_x ==
s->mb_width &&
s->end_mb_y ==
s->mb_height) {
426 } else {
428 "disabling error correction due to block count mismatch %dx%d != %dx%d\n",
429 v->
end_mb_x,
s->end_mb_y,
s->mb_width,
s->mb_height);
430 }
431
433
434 f =
s->current_picture.f;
435
437 ctx->dsp.upsample_plane(
f->data[0],
f->linesize[0],
w,
h);
438 ctx->dsp.upsample_plane(
f->data[1],
f->linesize[1],
w+1 >> 1,
h+1 >> 1);
439 ctx->dsp.upsample_plane(
f->data[2],
f->linesize[2],
w+1 >> 1,
h+1 >> 1);
442 "Asymmetric WMV9 rectangle subsampling");
443
445
446 if (wmv9_mask != -1)
447 ctx->dsp.mss2_blit_wmv9_masked(
c->rgb_pic + y *
c->rgb_stride + x * 3,
448 c->rgb_stride, wmv9_mask,
449 c->pal_pic + y *
c->pal_stride + x,
451 f->data[0],
f->linesize[0],
452 f->data[1],
f->data[2],
f->linesize[1],
454 else
455 ctx->dsp.mss2_blit_wmv9(
c->rgb_pic + y *
c->rgb_stride + x * 3,
457 f->data[0],
f->linesize[0],
458 f->data[1],
f->data[2],
f->linesize[1],
460
462
463 return 0;
464 }
465
468 };
469
472 };
473
475 {
476 #define COMPARE(top, bottom, left, right) \
477 if (rect->top <= draw->top && rect->bottom >= draw->bottom) { \
478 if (rect->left <= draw->left && rect->right >= draw->left) \
479 draw->left = FFMIN(rect->right, draw->right); \
480 \
481 if (rect->right >= draw->right) { \
482 if (rect->left >= draw->left) { \
483 if (rect->left < draw->right) \
484 draw->right = rect->left; \
485 } else { \
486 draw->right = draw->left; \
487 } \
488 } \
489 }
490
493 }
494
496 {
499
501 }
502
503 #define MAX_WMV9_RECTANGLES 20
504 #define ARITH2_PADDING 2
505
508 {
509 const uint8_t *buf = avpkt->
data;
510 int buf_size = avpkt->
size;
516
517 int keyframe, has_wmv9, has_mv, is_rle, is_555,
ret;
518
521 int used_rects = 0,
i, implicit_rect = 0, wmv9_mask = -1;
522
525
532 if (
c->slice_split > 0)
533 ctx->split_position =
c->slice_split;
534 else if (
c->slice_split < 0) {
539 else
541 } else
543 } else {
544 if (keyframe)
546 }
547 } else
549
550 if (
c->slice_split && (
ctx->split_position < 1 - is_555 ||
551 ctx->split_position > avctx->
height - 1))
553
557
558 if (buf_size < 1)
560
561 if (is_555 && (has_wmv9 || has_mv ||
c->slice_split &&
ctx->split_position))
563
567
568 if (has_wmv9) {
571
572 implicit_rect = !arith2_get_bit(&acoder);
573
574 while (arith2_get_bit(&acoder)) {
577 r = &wmv9rects[used_rects];
578 if (!used_rects)
580 else
582 wmv9rects[used_rects - 1].
x) +
583 wmv9rects[used_rects - 1].
x;
587 used_rects++;
588 }
589
590 if (implicit_rect && used_rects) {
593 }
594
595 if (implicit_rect) {
598 wmv9rects[0].
w = avctx->
width;
599 wmv9rects[0].
h = avctx->
height;
600
601 used_rects = 1;
602 }
603 for (
i = 0;
i < used_rects;
i++) {
604 if (!implicit_rect && arith2_get_bit(&acoder)) {
607 }
609 wmv9_mask = arith2_get_bit(&acoder) - 1;
610 if (!wmv9_mask)
612 }
614 }
615
618 if (buf_size < 1)
620 }
621
623 if (keyframe && !is_555) {
628 } else if (has_mv) {
629 buf += 4;
630 buf_size -= 4;
631 if (buf_size < 1)
635 }
636
637 if (
c->mvX < 0 ||
c->mvY < 0) {
638 FFSWAP(uint8_t *,
c->pal_pic,
c->last_pal_pic);
639
642
643 if (
ctx->last_pic->data[0]) {
645 c->last_rgb_pic =
ctx->last_pic->data[0] +
646 ctx->last_pic->linesize[0] * (avctx->
height - 1);
647 } else {
650 }
651 } else {
656
657 c->last_rgb_pic =
NULL;
658 }
662
663 if (keyframe)
665 else
668
669 if (is_555) {
671
672 if (
decode_555(avctx, &gB, (uint16_t *)
c->rgb_pic,
c->rgb_stride >> 1,
675
677 } else {
678 if (keyframe) {
683 }
684 if (is_rle) {
688 c->rgb_pic,
c->rgb_stride,
c->pal, keyframe,
689 ctx->split_position, 0,
693
696 c->rgb_pic,
c->rgb_stride,
c->pal, keyframe,
697 ctx->split_position, 1,
700
704 } else if (!implicit_rect || wmv9_mask != -1) {
709 c->keyframe = keyframe;
710
715 if (wmv9_mask == -1) {
716 for (
i = 0;
i < used_rects;
i++) {
718 r.left = wmv9rects[
i].
x;
719 r.top = wmv9rects[
i].
y;
720 r.right =
r.left + wmv9rects[
i].
w;
721 r.bottom =
r.top + wmv9rects[
i].
h;
723 }
724 }
725
729
730 if (
c->slice_split &&
draw.bottom -
draw.top >= 10) {
734 ctx->split_position -
draw.top))
738 if (
c->slice_split) {
739 if (buf_size < 1)
746 draw.bottom -
ctx->split_position))
750 }
751 } else {
755
758 }
759 } else
760 memset(
c->pal_pic, 0,
c->pal_stride * avctx->
height);
761 }
762
763 if (has_wmv9) {
764 for (
i = 0;
i < used_rects;
i++) {
765 int x = wmv9rects[
i].
x;
766 int y = wmv9rects[
i].
y;
767 int w = wmv9rects[
i].
w;
768 int h = wmv9rects[
i].
h;
769 if (wmv9rects[
i].coded) {
770 int WMV9codedFrameSize;
771 if (buf_size < 4 || !(WMV9codedFrameSize =
AV_RL24(buf)))
774 x, y,
w,
h, wmv9_mask))
776 buf += WMV9codedFrameSize + 3;
777 buf_size -= WMV9codedFrameSize + 3;
778 } else {
779 uint8_t *dst =
c->rgb_pic + y *
c->rgb_stride + x * 3;
780 if (wmv9_mask != -1) {
781 ctx->dsp.mss2_gray_fill_masked(dst,
c->rgb_stride,
782 wmv9_mask,
783 c->pal_pic + y *
c->pal_stride + x,
786 } else {
787 do {
788 memset(dst, 0x80,
w * 3);
789 dst +=
c->rgb_stride;
791 }
792 }
793 }
794 }
795
796 if (buf_size)
798
799 if (
c->mvX < 0 ||
c->mvY < 0) {
803 }
804
805 *got_frame = 1;
806
808 }
809
811 {
814
816
818
820
825
828
832
834
836
839
841
843
846
849
851
853
855
859
860 return 0;
861 }
862
864 {
866
868
873
874 return 0;
875 }
876
878 {
886 c->pal_stride =
c->mask_stride;
889 if (!
c->pal_pic || !
c->last_pal_pic || !
ctx->last_pic)
894
897
898
899 return 0;
900 }
901
913 };
static int decode_wmv9(AVCodecContext *avctx, const uint8_t *buf, int buf_size, int x, int y, int w, int h, int wmv9_mask)
#define AV_LOG_WARNING
Something somehow does not look correct.
#define COMPARE(top, bottom, left, right)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
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
int end_mb_x
Horizontal macroblock limit (used only by mss2)
int overlap
overlapped transforms in use
int max_b_frames
max number of B-frames for encoding
#define ARITH_GET_MODEL_SYM(prefix)
static void calc_draw_region(struct Rectangle2 *draw, const struct Rectangle2 *rect)
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.
void ff_vc1_init_transposed_scantables(VC1Context *v)
This structure describes decoded (raw) audio or video data.
int ff_vc1_decode_init(AVCodecContext *avctx)
int fastuvmc
Rounding of qpel vector to hpel ? (not in Simple)
const uint8_t * zz_8x4
Zigzag scan table for TT_8x4 coding mode.
struct AVCodecContext * avctx
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
static void arith2_init(ArithCoder *c, GetByteContext *gB)
static int arith2_get_number(ArithCoder *c, int n)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext *gb)
static void skip_bits(GetBitContext *s, int n)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVCodec p
The public AVCodec.
av_cold void ff_mss2dsp_init(MSS2DSPContext *dsp)
int multires
frame-level RESPIC syntax element present
static int decode_555(AVCodecContext *avctx, GetByteContext *gB, uint16_t *dst, ptrdiff_t stride, int keyframe, int w, int h)
static double val(void *priv, double ch)
static int arith2_get_scaled_value(int value, int n, int range)
static int arith2_get_consumed_bytes(ArithCoder *c)
int dquant
How qscale varies with MBs, 2 bits (not in Simple)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static int calc_split_position(int split_position, const struct Rectangle2 *rect, int height)
#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.
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
void ff_er_frame_end(ERContext *s, int *decode_error_flags)
Indicate that a frame has finished decoding and perform error concealment in case it has been enabled...
#define FF_CODEC_DECODE_CB(func)
int res_sprite
Simple/Main Profile sequence header.
int res_fasttx
reserved, always 1
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
void ff_mpeg_er_frame_start(MpegEncContext *s)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define vlc_init(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
int rangered
RANGEREDFRM (range reduction) syntax element present at frame level.
int ff_vc1_decode_end(AVCodecContext *avctx)
Close a VC1/WMV3 decoder.
void ff_vc1_init_common(VC1Context *v)
Init VC-1 specific tables and VC1Context members.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
#define CODEC_LONG_NAME(str)
@ AVDISCARD_ALL
discard all
void ff_vc1_decode_blocks(VC1Context *v)
@ AV_PICTURE_TYPE_I
Intra.
static unsigned int get_bits1(GetBitContext *s)
int resync_marker
could this stream contain resync markers
#define MAX_WMV9_RECTANGLES
static int arith2_get_prob(ArithCoder *c, int16_t *probs)
static av_cold int mss2_decode_end(AVCodecContext *avctx)
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
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 av_always_inline int bytestream2_tell(GetByteContext *g)
#define ARITH_GET_BIT(prefix)
enum AVPictureType pict_type
Picture type of the frame.
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.
static void scale(int *out, const int *in, const int w, const int h, const int shift)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
const uint8_t ff_wmv2_scantableB[64]
const FFCodec ff_mss2_decoder
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_RL24
const uint8_t ff_wmv2_scantableA[64]
static int decode_pal_v2(MSS12Context *ctx, const uint8_t *buf, int buf_size)
int res_transtab
reserved, always 0
uint8_t respic
Frame-level flag for resized images.
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
static char * split(char *message, char delim)
void ff_mpeg_flush(AVCodecContext *avctx)
enum AVDiscard skip_loop_filter
Skip loop filtering for selected frames.
static int draw(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define i(width, name, range_min, range_max)
int frmrtq_postproc
3 bits,
#define AV_PIX_FMT_RGB555
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
static av_cold int mss2_decode_init(AVCodecContext *avctx)
int extended_mv
Ext MV in P/B (not in Simple)
av_cold int ff_mss12_decode_end(MSS12Context *c)
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const uint8_t * zz_4x8
Zigzag scan table for TT_4x8 coding mode.
const char * name
Name of the codec implementation.
static int decode_rle(GetBitContext *gb, uint8_t *pal_dst, ptrdiff_t pal_stride, uint8_t *rgb_dst, ptrdiff_t rgb_stride, uint32_t *pal, int keyframe, int kf_slipt, int slice, int w, int h)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int res_y411
reserved, old interlaced mode
static av_cold int wmv9_init(AVCodecContext *avctx)
void ff_vlc_free(VLC *vlc)
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.
static void arith2_normalise(ArithCoder *c)
#define FFSWAP(type, a, b)
static const uint8_t * align_get_bits(GetBitContext *s)
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
int av_frame_replace(AVFrame *dst, const AVFrame *src)
Ensure the destination frame refers to the same data described by the source frame,...
main external API structure.
int res_rtm_flag
reserved, set to 1
int profile
Sequence header data for all Profiles TODO: choose between ints, uint8_ts and monobit flags.
void ff_mpv_frame_end(MpegEncContext *s)
int vstransform
variable-size [48]x[48] transform type + info
static void arith2_rescale_interval(ArithCoder *c, int range, int low, int high, int n)
int ff_mss12_decode_rect(SliceContext *sc, ArithCoder *acoder, int x, int y, int width, int height)
@ AV_PICTURE_TYPE_P
Predicted.
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
#define avpriv_request_sample(...)
This structure stores compressed data.
void ff_mss12_slicecontext_reset(SliceContext *sc)
int width
picture width / height.
int finterpflag
INTERPFRM present.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int quantizer_mode
2 bits, quantizer mode used for sequence, see QUANT_*
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
av_cold int ff_mss12_decode_init(MSS12Context *c, int version, SliceContext *sc1, SliceContext *sc2)
static void BS_FUNC() skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
static int mss2_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *avpkt)
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_WB24 unsigned int_TMPL AV_RB16
int bitrtq_postproc
5 bits, quantized framerate-based postprocessing strength
Generated on Thu Sep 26 2024 23:15:14 for FFmpeg by
doxygen
1.8.17