Mercurial > libavcodec.hg
comparison dv.c @ 8707:99ce98bd57a3 libavcodec
simplifying DIF encoding process
author | romansh |
---|---|
date | Sat, 31 Jan 2009 01:39:05 +0000 |
parents | ddcd5db645e3 |
children | 2ecdf1ad277f |
comparison
equal
deleted
inserted
replaced
8706:ddcd5db645e3 | 8707:99ce98bd57a3 |
---|---|
999 DVVideoContext *s = avctx->priv_data; | 999 DVVideoContext *s = avctx->priv_data; |
1000 int mb_index, i, j; | 1000 int mb_index, i, j; |
1001 int mb_x, mb_y, c_offset, linesize; | 1001 int mb_x, mb_y, c_offset, linesize; |
1002 uint8_t* y_ptr; | 1002 uint8_t* y_ptr; |
1003 uint8_t* data; | 1003 uint8_t* data; |
1004 uint8_t* ptr; | |
1005 uint8_t* dif; | 1004 uint8_t* dif; |
1006 uint8_t scratch[64]; | 1005 uint8_t scratch[64]; |
1007 EncBlockInfo enc_blks[5*DV_MAX_BPM]; | 1006 EncBlockInfo enc_blks[5*DV_MAX_BPM]; |
1008 PutBitContext pbs[5*DV_MAX_BPM]; | 1007 PutBitContext pbs[5*DV_MAX_BPM]; |
1009 PutBitContext* pb; | 1008 PutBitContext* pb; |
1010 EncBlockInfo* enc_blk; | 1009 EncBlockInfo* enc_blk; |
1011 int vs_bit_size = 0; | 1010 int vs_bit_size = 0; |
1012 int qnos[5]; | 1011 int qnos[5]; |
1012 int* qnosp = &qnos[0]; | |
1013 | 1013 |
1014 dif = &s->buf[work_chunk->buf_offset*80]; | 1014 dif = &s->buf[work_chunk->buf_offset*80]; |
1015 enc_blk = &enc_blks[0]; | 1015 enc_blk = &enc_blks[0]; |
1016 pb = &pbs[0]; | |
1017 for (mb_index = 0; mb_index < 5; mb_index++) { | 1016 for (mb_index = 0; mb_index < 5; mb_index++) { |
1018 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y); | 1017 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y); |
1019 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3); | 1018 y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3); |
1020 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] + | 1019 c_offset = (((mb_y >> (s->sys->pix_fmt == PIX_FMT_YUV420P)) * s->picture.linesize[1] + |
1021 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3); | 1020 (mb_x >> ((s->sys->pix_fmt == PIX_FMT_YUV411P) ? 2 : 1))) << 3); |
1022 qnos[mb_index] = 15; /* No quantization */ | 1021 qnos[mb_index] = 15; /* No quantization */ |
1023 ptr = dif + mb_index*80 + 4; | |
1024 for (j = 0; j < 6; j++) { | 1022 for (j = 0; j < 6; j++) { |
1025 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */ | 1023 if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */ |
1026 if (j == 0 || j == 2) { | 1024 if (j == 0 || j == 2) { |
1027 /* Y0 Y1 */ | 1025 /* Y0 Y1 */ |
1028 data = y_ptr + ((j >> 1) * 8); | 1026 data = y_ptr + ((j >> 1) * 8); |
1065 } | 1063 } |
1066 } | 1064 } |
1067 | 1065 |
1068 vs_bit_size += dv_init_enc_block(enc_blk, data, linesize, s, j>>2); | 1066 vs_bit_size += dv_init_enc_block(enc_blk, data, linesize, s, j>>2); |
1069 | 1067 |
1070 init_put_bits(pb, ptr, s->sys->block_sizes[j]/8); | |
1071 put_bits(pb, 9, (uint16_t)(((enc_blk->mb[0] >> 3) - 1024 + 2) >> 2)); | |
1072 put_bits(pb, 1, enc_blk->dct_mode); | |
1073 put_bits(pb, 2, enc_blk->cno); | |
1074 | |
1075 ++enc_blk; | 1068 ++enc_blk; |
1076 ++pb; | |
1077 ptr += s->sys->block_sizes[j]/8; | |
1078 } | 1069 } |
1079 } | 1070 } |
1080 | 1071 |
1081 if (vs_total_ac_bits < vs_bit_size) | 1072 if (vs_total_ac_bits < vs_bit_size) |
1082 dv_guess_qnos(&enc_blks[0], &qnos[0]); | 1073 dv_guess_qnos(&enc_blks[0], qnosp); |
1083 | 1074 |
1084 for (i = 0; i < 5; i++) { | 1075 /* DIF encoding process */ |
1085 dif[i*80 + 3] = qnos[i]; | 1076 for (j=0; j<5*s->sys->bpm;) { |
1086 } | 1077 int start_mb = j; |
1087 | 1078 |
1088 /* First pass over individual cells only */ | 1079 dif[3] = *qnosp++; |
1089 for (j = 0; j < 5 * s->sys->bpm; j++) | 1080 dif += 4; |
1090 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]); | 1081 |
1091 | 1082 /* First pass over individual cells only */ |
1092 /* Second pass over each MB space */ | 1083 for (i=0; i<s->sys->bpm; i++, j++) { |
1093 for (j=0; j<5*s->sys->bpm; j+=s->sys->bpm) { | 1084 int sz = s->sys->block_sizes[i]>>3; |
1094 pb = &pbs[j]; | 1085 |
1086 init_put_bits(&pbs[j], dif, sz); | |
1087 put_bits(&pbs[j], 9, (uint16_t)(((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2)); | |
1088 put_bits(&pbs[j], 1, enc_blks[j].dct_mode); | |
1089 put_bits(&pbs[j], 2, enc_blks[j].cno); | |
1090 | |
1091 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]); | |
1092 dif += sz; | |
1093 } | |
1094 | |
1095 /* Second pass over each MB space */ | |
1096 pb = &pbs[start_mb]; | |
1095 for (i=0; i<s->sys->bpm; i++) { | 1097 for (i=0; i<s->sys->bpm; i++) { |
1096 if (enc_blks[i+j].partial_bit_count) | 1098 if (enc_blks[start_mb+i].partial_bit_count) |
1097 pb = dv_encode_ac(&enc_blks[i+j], pb, &pbs[j+s->sys->bpm]); | 1099 pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]); |
1098 } | 1100 } |
1099 } | 1101 } |
1100 | 1102 |
1101 /* Third and final pass over the whole video segment space */ | 1103 /* Third and final pass over the whole video segment space */ |
1102 pb = &pbs[0]; | 1104 pb = &pbs[0]; |