mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
simplifying DIF encoding process
Originally committed as revision 16877 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
76bd5997a9
commit
85eca52be4
@ -1001,7 +1001,6 @@ static int dv_encode_video_segment(AVCodecContext *avctx, DVwork_chunk *work_chu
|
|||||||
int mb_x, mb_y, c_offset, linesize;
|
int mb_x, mb_y, c_offset, linesize;
|
||||||
uint8_t* y_ptr;
|
uint8_t* y_ptr;
|
||||||
uint8_t* data;
|
uint8_t* data;
|
||||||
uint8_t* ptr;
|
|
||||||
uint8_t* dif;
|
uint8_t* dif;
|
||||||
uint8_t scratch[64];
|
uint8_t scratch[64];
|
||||||
EncBlockInfo enc_blks[5*DV_MAX_BPM];
|
EncBlockInfo enc_blks[5*DV_MAX_BPM];
|
||||||
@ -1010,17 +1009,16 @@ static int dv_encode_video_segment(AVCodecContext *avctx, DVwork_chunk *work_chu
|
|||||||
EncBlockInfo* enc_blk;
|
EncBlockInfo* enc_blk;
|
||||||
int vs_bit_size = 0;
|
int vs_bit_size = 0;
|
||||||
int qnos[5];
|
int qnos[5];
|
||||||
|
int* qnosp = &qnos[0];
|
||||||
|
|
||||||
dif = &s->buf[work_chunk->buf_offset*80];
|
dif = &s->buf[work_chunk->buf_offset*80];
|
||||||
enc_blk = &enc_blks[0];
|
enc_blk = &enc_blks[0];
|
||||||
pb = &pbs[0];
|
|
||||||
for (mb_index = 0; mb_index < 5; mb_index++) {
|
for (mb_index = 0; mb_index < 5; mb_index++) {
|
||||||
dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
|
dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
|
||||||
y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
|
y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
|
||||||
c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
|
c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] +
|
||||||
(mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3);
|
(mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3);
|
||||||
qnos[mb_index] = 15; /* No quantization */
|
qnos[mb_index] = 15; /* No quantization */
|
||||||
ptr = dif + mb_index*80 + 4;
|
|
||||||
for (j = 0; j < 6; j++) {
|
for (j = 0; j < 6; j++) {
|
||||||
if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
|
if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
|
||||||
if (j == 0 || j == 2) {
|
if (j == 0 || j == 2) {
|
||||||
@ -1067,34 +1065,38 @@ static int dv_encode_video_segment(AVCodecContext *avctx, DVwork_chunk *work_chu
|
|||||||
|
|
||||||
vs_bit_size += dv_init_enc_block(enc_blk, data, linesize, s, j>>2);
|
vs_bit_size += dv_init_enc_block(enc_blk, data, linesize, s, j>>2);
|
||||||
|
|
||||||
init_put_bits(pb, ptr, s->sys->block_sizes[j]/8);
|
|
||||||
put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2));
|
|
||||||
put_bits(pb, 1, enc_blk->dct_mode);
|
|
||||||
put_bits(pb, 2, enc_blk->cno);
|
|
||||||
|
|
||||||
++enc_blk;
|
++enc_blk;
|
||||||
++pb;
|
|
||||||
ptr += s->sys->block_sizes[j]/8;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vs_total_ac_bits < vs_bit_size)
|
if (vs_total_ac_bits < vs_bit_size)
|
||||||
dv_guess_qnos(&enc_blks[0], &qnos[0]);
|
dv_guess_qnos(&enc_blks[0], qnosp);
|
||||||
|
|
||||||
for (i = 0; i < 5; i++) {
|
/* DIF encoding process */
|
||||||
dif[i*80 + 3] = qnos[i];
|
for (j=0; j<5*s->sys->bpm;) {
|
||||||
}
|
int start_mb = j;
|
||||||
|
|
||||||
/* First pass over individual cells only */
|
dif[3] = *qnosp++;
|
||||||
for (j = 0; j < 5 * s->sys->bpm; j++)
|
dif += 4;
|
||||||
dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
|
|
||||||
|
|
||||||
/* Second pass over each MB space */
|
/* First pass over individual cells only */
|
||||||
for (j=0; j<5*s->sys->bpm; j+=s->sys->bpm) {
|
for (i=0; i<s->sys->bpm; i++, j++) {
|
||||||
pb = &pbs[j];
|
int sz = s->sys->block_sizes[i]>>3;
|
||||||
|
|
||||||
|
init_put_bits(&pbs[j], dif, sz);
|
||||||
|
put_bits(&pbs[j], 9, (uint16_t)(((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2));
|
||||||
|
put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
|
||||||
|
put_bits(&pbs[j], 2, enc_blks[j].cno);
|
||||||
|
|
||||||
|
dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
|
||||||
|
dif += sz;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Second pass over each MB space */
|
||||||
|
pb = &pbs[start_mb];
|
||||||
for (i=0; i<s->sys->bpm; i++) {
|
for (i=0; i<s->sys->bpm; i++) {
|
||||||
if (enc_blks[i+j].partial_bit_count)
|
if (enc_blks[start_mb+i].partial_bit_count)
|
||||||
pb = dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+s->sys->bpm]);
|
pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user