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];