30 #define UNCHECKED_BITSTREAM_READER 1 55 #define H263_MBTYPE_B_VLC_BITS 6 56 #define CBPC_B_VLC_BITS 3 110 static volatile int done = 0;
142 for (i = 0; i < 6; i++)
158 unsigned int val, gob_number;
169 left =
FFMIN(left, 32);
171 for(;left>13; left--){
249 for(;left>16+1+5+5; left-=8){
283 val = (val - 1) << shift;
296 if (pred < -31 && val < -63)
298 if (pred > 32 && val > 63)
328 code = (sign) ? (pred - code) : (pred +
code);
340 int cbpc,
i, pred_x, pred_y, mx, my;
357 mot_val[0 ]= mot_val[2 ]=
359 mot_val[1 ]= mot_val[3 ]=
380 if ((cbpc & 16) == 0) {
394 mot_val[0 ]= mot_val[2 ]=
396 mot_val[1 ]= mot_val[3 ]=
411 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
430 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
465 component = (n <= 3 ? 0 : n - 4 + 1);
472 level = level & 0xff;
484 if((level&0x7F) == 0){
517 if (CONFIG_FLV_DECODER && s->
h263_flv > 1) {
559 i = i - run + ((run-1)&63) + 1;
562 block[scan_table[
i]] =
level;
601 for (i = 0; i < 6; i++) {
617 if (pb_frame == 2 && c)
629 #define tab_size ((signed)FF_ARRAY_ELEMS(s->direct_scale_mv[0])) 630 #define tab_bias (tab_size / 2) 643 s->
mv[0][
i][0] = p_mx * time_pb / time_pp;
644 s->
mv[1][
i][0] = p_mx * (time_pb - time_pp) / time_pp;
651 s->
mv[0][
i][1] = p_my * time_pb / time_pp;
652 s->
mv[1][
i][1] = p_my * (time_pb - time_pp) / time_pp;
663 int colocated_mb_type = p->
mb_type[mb_index];
668 colocated_mb_type = p->
mb_type[mb_index];
671 if (
IS_8X8(colocated_mb_type)) {
673 for (i = 0; i < 4; i++)
680 s->
mv[0][3][0] = s->
mv[0][0][0];
683 s->
mv[0][3][1] = s->
mv[0][0][1];
686 s->
mv[1][3][0] = s->
mv[1][0][0];
689 s->
mv[1][3][1] = s->
mv[1][0][1];
697 int16_t
block[6][64])
699 int cbpc, cbpy,
i, cbp, pred_x, pred_y, mx, my, dquant;
702 int cbpb = 0, pb_mv_count = 0;
746 cbp = (cbpc & 3) | (cbpy << 2);
752 if ((cbpc & 16) == 0) {
775 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
797 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
811 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*
stride]= mot_val0[2+2*
stride]=
812 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*
stride]= mot_val0[3+2*
stride]=
813 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*
stride]= mot_val1[2+2*
stride]=
814 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*
stride]= mot_val1[3+2*
stride]= 0;
845 cbp = (cbpc & 3) | (cbpy << 2);
881 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
886 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*
stride]= mot_val[2+2*
stride]= mx;
887 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*
stride]= mot_val[3+2*
stride]= my;
908 if (s->
umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
913 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*
stride]= mot_val[2+2*
stride]= mx;
914 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*
stride]= mot_val[3+2*
stride]= my;
951 cbp = (cbpc & 3) | (cbpy << 2);
959 while(pb_mv_count--){
965 for (i = 0; i < 6; i++) {
1012 startcode = ((startcode << 8) |
get_bits(&s->
gb, 8)) & 0x003FFFFF;
1014 if(startcode == 0x20)
1018 if (startcode != 0x20) {
1049 if (format != 7 && format != 6) {
1115 }
else if (ufep != 0) {
1153 ff_dlog(s->
avctx,
"\nH.263+ Custom picture: %dx%d\n",width,height);
1167 if ((width == 0) || (height == 0))
1285 for(i=0; i<13; i++){
static unsigned int show_bits_long(GetBitContext *s, int n)
Show 0-32 bits.
av_cold void ff_h263_decode_init_vlc(void)
int rv10_first_dc_coded[3]
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
ScanTable intra_v_scantable
static int h263_decode_gob_header(MpegEncContext *s)
Decode the group of blocks header or slice header.
static int shift(int a, int b)
VLC ff_h263_inter_MCBPC_vlc
const uint8_t * y_dc_scale_table
qscale -> y_dc_scale table
const uint16_t ff_mba_max[6]
static void set_one_direct_mv(MpegEncContext *s, Picture *p, int i)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
void(* clear_block)(int16_t *block)
#define avpriv_request_sample(...)
#define SKIP_COUNTER(name, gb, num)
static int check_marker(void *logctx, GetBitContext *s, const char *msg)
#define AV_EF_COMPLIANT
consider all spec non compliances as errors
int obmc
overlapped block motion compensation
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
static int h263_decode_block(MpegEncContext *s, int16_t *block, int n, int coded)
#define AV_EF_BITSTREAM
detect bitstream specification deviations
const uint16_t ff_h263_format[8][2]
#define AV_CODEC_FLAG2_CHUNKS
Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries...
int mb_num
number of MBs of a picture
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 format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
static int get_sbits(GetBitContext *s, int n)
int h263_aic
Advanced INTRA Coding (AIC)
int16_t * ff_h263_pred_motion(MpegEncContext *s, int block, int dir, int *px, int *py)
Macro definitions for various function/variable attributes.
#define USES_LIST(a, list)
int alt_inter_vlc
alternative inter vlc
int mb_num_left
number of MBs left in this video packet (for partitioned Slices only)
int64_t time
time of current frame
const uint8_t ff_mpeg1_dc_scale_table[128]
#define MV_DIRECT
bidirectional mode where the difference equals the MV of the last P/S/I-Frame (MPEG-4) ...
The exact code depends on how similar the blocks are and how related they are to the block
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define FF_DEBUG_PICT_INFO
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
#define LOCAL_ALIGNED_32(t, v,...)
static VLC h263_mbtype_b_vlc
int ff_rv_decode_dc(MpegEncContext *s, int n)
int no_rounding
apply no rounding to motion compensation (MPEG-4, msmpeg4, ...) for B-frames rounding mode is always ...
Picture current_picture
copy of the current picture structure.
GetBitContext last_resync_gb
used to search for the next resync marker
static int get_bits_count(const GetBitContext *s)
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
const uint8_t ff_h263_intra_MCBPC_bits[9]
uint16_t pp_time
time distance between the last 2 p,s,i frames
const uint8_t ff_mba_length[7]
int mb_height
number of MBs horizontally & vertically
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
static int h263_skip_b_part(MpegEncContext *s, int cbp)
int codec_tag
internal codec_tag upper case converted from avctx codec_tag
void ff_set_qscale(MpegEncContext *s, int qscale)
set qscale and update qscale dependent variables.
const uint8_t ff_h263_mbtype_b_tab[15][2]
static int get_bits_left(GetBitContext *gb)
#define H263_MBTYPE_B_VLC_BITS
int h263_plus
H.263+ headers.
#define UPDATE_CACHE(name, gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int last_dc[3]
last DC values for MPEG-1
const uint8_t ff_h263_inter_MCBPC_code[28]
int16_t direct_scale_mv[2][64]
precomputed to avoid divisions in ff_mpeg4_set_direct_mv
int mb_skipped
MUST BE SET only during DECODING.
const uint8_t ff_modified_quant_tab[2][32]
void(* clear_blocks)(int16_t *blocks)
int unrestricted_mv
mv can point outside of the coded picture
int ff_h263_decode_motion(MpegEncContext *s, int pred, int f_code)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static const int h263_mb_type_b_map[15]
int h263_slice_structured
#define INTER_MCBPC_VLC_BITS
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
void ff_mpeg4_init_direct_mv(MpegEncContext *s)
int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx)
Decode the next video packet.
int low_delay
no reordering needed / has no B-frames
static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
#define CLOSE_READER(name, gb)
#define INIT_VLC_RL(rl, static_size)
#define GET_RL_VLC(level, run, name, gb, table, bits,max_depth, need_update)
#define INIT_FIRST_VLC_RL(rl, static_size)
common internal API header
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
const uint8_t ff_h263_inter_MCBPC_bits[28]
enum AVPictureType pict_type
Picture type of the frame.
const uint8_t ff_h263_chroma_qscale_table[32]
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
int umvplus
== H.263+ && unrestricted_mv
int16_t(*[2] motion_val)[2]
static unsigned int show_bits(GetBitContext *s, int n)
Show 1-25 bits.
av_cold void ff_h263_init_rl_inter(void)
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
int block_last_index[12]
last non zero coefficient in block
int pb_frame
PB-frame mode (0 = none, 1 = base, 2 = improved)
int ff_h263_decode_mba(MpegEncContext *s)
RL_VLC_ELEM * rl_vlc[32]
decoding only
#define SHOW_UBITS(name, gb, num)
static int h263p_decode_umotion(MpegEncContext *s, int pred)
int block_index[6]
index to current MB in block based arrays with edges
static const float pred[4]
static const int8_t mv[256][2]
#define MV_TYPE_16X16
1 vector for the whole mb
const uint8_t ff_aic_dc_scale_table[32]
#define FF_ASPECT_EXTENDED
Libavcodec external API header.
int h263_flv
use flv H.263 header
const uint8_t ff_h263_intra_MCBPC_code[9]
static int set_direct_mv(MpegEncContext *s)
ScanTable intra_scantable
int height
picture size. must be a multiple of 16
#define OPEN_READER(name, gb)
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
#define SLICE_END
end marker found
VLC ff_h263_intra_MCBPC_vlc
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits1(GetBitContext *s)
ScanTable intra_h_scantable
static void skip_bits(GetBitContext *s, int n)
Rational number (pair of numerator and denominator).
int ff_h263_resync(MpegEncContext *s)
Decode the group of blocks / video packet header / slice header (MPEG-4 Studio).
#define SKIP_CACHE(name, gb, num)
const uint8_t ff_cbpc_b_tab[4][2]
int f_code
forward MV resolution
const uint8_t ff_h263_cbpy_tab[16][2]
int ff_h263_decode_picture_header(MpegEncContext *s)
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
static av_const int sign_extend(int val, unsigned bits)
static void h263_decode_dquant(MpegEncContext *s)
int h263_pred
use MPEG-4/H.263 ac/dc predictions
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
const AVRational ff_h263_pixel_aspect[16]
const uint8_t * c_dc_scale_table
qscale -> c_dc_scale table
int mv[2][4][2]
motion vectors for a macroblock first coordinate : 0 = forward 1 = backward second " : depend...
int b8_stride
2*mb_width+1 used for some 8x8 block arrays to allow simple addressing
struct AVCodecContext * avctx
#define SHOW_SBITS(name, gb, num)
GLint GLenum GLboolean GLsizei stride
common internal api header.
int mb_stride
mb_width+1 used for some arrays to allow simple addressing of left & top MBs without sig11 ...
void ff_h263_pred_acdc(MpegEncContext *s, int16_t *block, int n)
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
Picture last_picture
copy of the previous picture structure.
const uint8_t * chroma_qscale_table
qscale -> chroma_qscale (H.263)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
void ff_h263_show_pict_info(MpegEncContext *s)
Print picture info if FF_DEBUG_PICT_INFO is set.
int16_t(* block)[64]
points to one of the following blocks
VLC_TYPE(* table)[2]
code, bits
Picture next_picture
copy of the next picture structure.
static const uint8_t * align_get_bits(GetBitContext *s)
int flags2
AV_CODEC_FLAG2_*.
int chroma_qscale
chroma QP
int frame_number
Frame counter, set by libavcodec.
static void preview_obmc(MpegEncContext *s)
read the next MVs for OBMC.
uint32_t * mb_type
types and macros are defined in mpegutils.h
int rv10_version
RV10 version: 0 or 3.
static int skip_1stop_8data_bits(GetBitContext *gb)
int h263_long_vectors
use horrible H.263v1 long vector mode
#define MV_TYPE_8X8
4 vectors (H.263, MPEG-4 4MV)
int h263_aic_dir
AIC direction: 0 = left, 1 = top.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
static double val(void *priv, double ch)
int ff_h263_decode_mb(MpegEncContext *s, int16_t block[6][64])
#define INTRA_MCBPC_VLC_BITS
uint16_t pb_time
time distance between the last b and p,s,i frame
const uint8_t ff_mvtab[33][2]