📄 mpegvideo.c
字号:
if (motion_x == 0 && motion_y == 0) {
put_bits(&s->pb, 2, 1); /* macroblock_pattern only */
put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]);
} else {
put_bits(&s->pb, 1, 1); /* motion + cbp */
mpeg1_encode_motion(s, motion_x - s->last_motion_x);
mpeg1_encode_motion(s, motion_y - s->last_motion_y);
put_bits(&s->pb, mbPatTable[cbp][1], mbPatTable[cbp][0]);
}
} else {
put_bits(&s->pb, 3, 1); /* motion only */
mpeg1_encode_motion(s, motion_x - s->last_motion_x);
mpeg1_encode_motion(s, motion_y - s->last_motion_y);
}
}
}
for(i=0;i<6;i++) {
if (cbp & (1 << (5 - i))) {
encode_block(s, block[i], i);
}
}
s->mb_incr = 1;
}
}
static int dct_quantize(MpegEncContext *s,
DCTELEM *block, int n,
int qscale)
{
int i, j, level, last_non_zero, q;
const int *qmat;
jpeg_fdct_ifast (block);
if (s->mb_intra) {
if (n < 4)
q = s->y_dc_scale;
else
q = s->c_dc_scale;
q = q << 3;
/* note: block[0] is assumed to be positive */
block[0] = (block[0] + (q >> 1)) / q;
i = 1;
last_non_zero = 0;
if (s->out_format == FMT_H263) {
qmat = s->non_intra_matrix;
} else {
qmat = s->intra_matrix;
}
} else {
i = 0;
last_non_zero = -1;
qmat = s->non_intra_matrix;
}
for(;i<64;i++) {
j = zigzag_direct[i];
level = block[j];
/* XXX: overflow can occur here at qscale < 3 */
level = level * qmat[j];
#ifdef PARANOID
{
int level1;
level1 = ((long long)block[j] * (long long)(qmat[j]));
if (level1 != level)
fprintf(stderr, "quant error %d %d\n", level, level1);
}
#endif
/* XXX: slight error for the low range */
//if (level <= -(1 << 22) || level >= (1 << 22))
if (((level << 9) >> 9) != level) {
level = level / (1 << 22);
/* XXX: currently, this code is not optimal. the range should be:
mpeg1: -255..255
mpeg2: -2048..2047
h263: -128..127
mpeg4: -2048..2047
*/
if (level > 127)
level = 127;
else if (level < -128)
level = -128;
block[j] = level;
last_non_zero = i;
} else {
block[j] = 0;
}
}
return last_non_zero;
}
static void dct_unquantize(MpegEncContext *s,
DCTELEM *block, int n, int qscale)
{
int i, level;
const UINT8 *quant_matrix;
if (s->mb_intra) {
if (n < 4)
block[0] = block[0] * s->y_dc_scale;
else
block[0] = block[0] * s->c_dc_scale;
if (s->out_format == FMT_H263) {
i = 1;
goto unquant_even;
}
quant_matrix = default_intra_matrix;
for(i=1;i<64;i++) {
level = block[i];
if (level) {
if (level < 0) {
level = -level;
level = (int)(level * qscale * quant_matrix[i]) >> 3;
level = (level - 1) | 1;
level = -level;
} else {
level = (int)(level * qscale * quant_matrix[i]) >> 3;
level = (level - 1) | 1;
}
#ifdef PARANOID
if (level < -2048 || level > 2047)
fprintf(stderr, "unquant error %d %d\n", i, level);
#endif
block[i] = level;
}
}
} else {
i = 0;
unquant_even:
quant_matrix = default_non_intra_matrix;
for(;i<64;i++) {
level = block[i];
if (level) {
if (level < 0) {
level = -level;
level = (((level << 1) + 1) * qscale *
((int) (quant_matrix[i]))) >> 4;
level = (level - 1) | 1;
level = -level;
} else {
level = (((level << 1) + 1) * qscale *
((int) (quant_matrix[i]))) >> 4;
level = (level - 1) | 1;
}
#ifdef PARANOID
if (level < -2048 || level > 2047)
fprintf(stderr, "unquant error %d %d\n", i, level);
#endif
block[i] = level;
}
}
}
}
static inline void encode_dc(MpegEncContext *s, int diff, int component)
{
int adiff, index;
// printf("dc=%d c=%d\n", diff, component);
adiff = abs(diff);
index = vlc_dc_table[adiff];
if (component == 0) {
put_bits(&s->pb, vlc_dc_lum_bits[index], vlc_dc_lum_code[index]);
} else {
put_bits(&s->pb, vlc_dc_chroma_bits[index], vlc_dc_chroma_code[index]);
}
if (diff > 0) {
put_bits(&s->pb, index, (diff & ((1 << index) - 1)));
} else if (diff < 0) {
put_bits(&s->pb, index, ((diff - 1) & ((1 << index) - 1)));
}
}
static void encode_block(MpegEncContext *s,
DCTELEM *block,
int n)
{
int alevel, level, last_non_zero, dc, diff, i, j, run, last_index;
int code, nbits, component;
last_index = s->block_last_index[n];
/* DC coef */
if (s->mb_intra) {
component = (n <= 3 ? 0 : n - 4 + 1);
dc = block[0]; /* overflow is impossible */
diff = dc - s->last_dc[component];
encode_dc(s, diff, component);
s->last_dc[component] = dc;
i = 1;
} else {
/* encode the first coefficient : needs to be done here because
it is handled slightly differently */
level = block[0];
if (abs(level) == 1) {
code = ((UINT32)level >> 31); /* the sign bit */
put_bits(&s->pb, 2, code | 0x02);
i = 1;
} else {
i = 0;
last_non_zero = -1;
goto next_coef;
}
}
/* now quantify & encode AC coefs */
last_non_zero = i - 1;
for(;i<=last_index;i++) {
j = zigzag_direct[i];
level = block[j];
next_coef:
#if 0
if (level != 0)
printf("level[%d]=%d\n", i, level);
#endif
/* encode using VLC */
if (level != 0) {
run = i - last_non_zero - 1;
alevel = abs(level);
// printf("run=%d level=%d\n", run, level);
if ( (run < HUFF_MAXRUN) && (alevel < huff_maxlevel[run])) {
/* encode using the Huffman tables */
code = (huff_table[run])[alevel];
nbits = (huff_bits[run])[alevel];
code |= ((UINT32)level >> 31); /* the sign bit */
put_bits(&s->pb, nbits, code);
} else {
/* escape: only clip in this case */
put_bits(&s->pb, 6, 0x1);
put_bits(&s->pb, 6, run);
if (alevel < 128) {
put_bits(&s->pb, 8, level & 0xff);
} else {
if (level < 0) {
put_bits(&s->pb, 16, 0x8001 + level + 255);
} else {
put_bits(&s->pb, 16, level & 0xffff);
}
}
}
last_non_zero = i;
}
}
/* end of block */
put_bits(&s->pb, 2, 0x2);
}
/* rate control */
/* an I frame is I_FRAME_SIZE_RATIO bigger than a P frame */
#define I_FRAME_SIZE_RATIO 3.0
#define QSCALE_K 20
static void rate_control_init(MpegEncContext *s)
{
s->wanted_bits = 0;
if (s->intra_only) {
s->I_frame_bits = s->bit_rate / s->frame_rate;
s->P_frame_bits = s->I_frame_bits;
} else {
s->P_frame_bits = (int) ((float)(s->gop_size * s->bit_rate) /
(float)(s->frame_rate * (I_FRAME_SIZE_RATIO + s->gop_size - 1)));
s->I_frame_bits = (int)(s->P_frame_bits * I_FRAME_SIZE_RATIO);
}
#if defined(DEBUG)
printf("I_frame_size=%d P_frame_size=%d\n",
s->I_frame_bits, s->P_frame_bits);
#endif
}
/*
* This heuristic is rather poor, but at least we do not have to
* change the qscale at every macroblock.
*/
static int rate_estimate_qscale(MpegEncContext *s)
{
long long total_bits = s->total_bits;
float q;
int qscale, diff, qmin;
if (s->pict_type == I_TYPE) {
s->wanted_bits += s->I_frame_bits;
} else {
s->wanted_bits += s->P_frame_bits;
}
diff = s->wanted_bits - total_bits;
q = 31.0 - (float)diff / (QSCALE_K * s->mb_height * s->mb_width);
/* adjust for I frame */
if (s->pict_type == I_TYPE && !s->intra_only) {
q /= I_FRAME_SIZE_RATIO;
}
/* using a too small Q scale leeds to problems in mpeg1 and h263
because AC coefficients are clamped to 255 or 127 */
qmin = 3;
if (q < qmin)
q = qmin;
else if (q > 31)
q = 31;
qscale = (int)(q + 0.5);
#if defined(DEBUG)
printf("%d: total=%Ld br=%0.1f diff=%d qest=%0.1f\n",
s->picture_number,
total_bits, (float)s->frame_rate * total_bits / s->picture_number,
diff, q);
#endif
return qscale;
}
AVEncoder mpeg1video_encoder = {
"mpeg1video",
CODEC_TYPE_VIDEO,
CODEC_ID_MPEG1VIDEO,
sizeof(MpegEncContext),
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
};
AVEncoder h263_encoder = {
"h263",
CODEC_TYPE_VIDEO,
CODEC_ID_H263,
sizeof(MpegEncContext),
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
};
AVEncoder rv10_encoder = {
"rv10",
CODEC_TYPE_VIDEO,
CODEC_ID_RV10,
sizeof(MpegEncContext),
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
};
AVEncoder mjpeg_encoder = {
"mjpeg",
CODEC_TYPE_VIDEO,
CODEC_ID_MJPEG,
sizeof(MpegEncContext),
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
};
AVEncoder divx_encoder = {
"divx",
CODEC_TYPE_VIDEO,
CODEC_ID_DIVX,
sizeof(MpegEncContext),
MPV_encode_init,
MPV_encode_picture,
MPV_encode_end,
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -