📄 vp3.c
字号:
} else { s->superblock_macroblocks[mapping_index] = -1; debug_init(" superblock %d, position %d has no macroblock (%d/%d x %d/%d)\n", i, j, current_width, right_edge, current_height, bottom_edge); } mapping_index++; } } /* initialize the macroblock <-> fragment mapping */ current_fragment = 0; current_macroblock = 0; mapping_index = 0; for (i = 0; i < s->fragment_height; i += 2) { for (j = 0; j < s->fragment_width; j += 2) { debug_init(" macroblock %d contains fragments: ", current_macroblock); s->all_fragments[current_fragment].macroblock = current_macroblock; s->macroblock_fragments[mapping_index++] = current_fragment; debug_init("%d ", current_fragment); if (j + 1 < s->fragment_width) { s->all_fragments[current_fragment + 1].macroblock = current_macroblock; s->macroblock_fragments[mapping_index++] = current_fragment + 1; debug_init("%d ", current_fragment + 1); } else s->macroblock_fragments[mapping_index++] = -1; if (i + 1 < s->fragment_height) { s->all_fragments[current_fragment + s->fragment_width].macroblock = current_macroblock; s->macroblock_fragments[mapping_index++] = current_fragment + s->fragment_width; debug_init("%d ", current_fragment + s->fragment_width); } else s->macroblock_fragments[mapping_index++] = -1; if ((j + 1 < s->fragment_width) && (i + 1 < s->fragment_height)) { s->all_fragments[current_fragment + s->fragment_width + 1].macroblock = current_macroblock; s->macroblock_fragments[mapping_index++] = current_fragment + s->fragment_width + 1; debug_init("%d ", current_fragment + s->fragment_width + 1); } else s->macroblock_fragments[mapping_index++] = -1; /* C planes */ c_fragment = s->u_fragment_start + (i * s->fragment_width / 4) + (j / 2); s->all_fragments[c_fragment].macroblock = s->macroblock_count; s->macroblock_fragments[mapping_index++] = c_fragment; debug_init("%d ", c_fragment); c_fragment = s->v_fragment_start + (i * s->fragment_width / 4) + (j / 2); s->all_fragments[c_fragment].macroblock = s->macroblock_count; s->macroblock_fragments[mapping_index++] = c_fragment; debug_init("%d ", c_fragment); debug_init("\n"); if (j + 2 <= s->fragment_width) current_fragment += 2; else current_fragment++; current_macroblock++; } current_fragment += s->fragment_width; } return 0; /* successful path out */}/* * This function unpacks a single token (which should be in the range 0..31) * and returns a zero run (number of zero coefficients in current DCT matrix * before next non-zero coefficient), the next DCT coefficient, and the * number of consecutive, non-EOB'd DCT blocks to EOB. */static void unpack_token(GetBitContext *gb, int token, int *zero_run, DCTELEM *coeff, int *eob_run) { int sign; *zero_run = 0; *eob_run = 0; *coeff = 0; debug_token(" vp3 token %d: ", token); switch (token) { case 0: debug_token("DCT_EOB_TOKEN, EOB next block\n"); *eob_run = 1; break; case 1: debug_token("DCT_EOB_PAIR_TOKEN, EOB next 2 blocks\n"); *eob_run = 2; break; case 2: debug_token("DCT_EOB_TRIPLE_TOKEN, EOB next 3 blocks\n"); *eob_run = 3; break; case 3: debug_token("DCT_REPEAT_RUN_TOKEN, "); *eob_run = get_bits(gb, 2) + 4; debug_token("EOB the next %d blocks\n", *eob_run); break; case 4: debug_token("DCT_REPEAT_RUN2_TOKEN, "); *eob_run = get_bits(gb, 3) + 8; debug_token("EOB the next %d blocks\n", *eob_run); break; case 5: debug_token("DCT_REPEAT_RUN3_TOKEN, "); *eob_run = get_bits(gb, 4) + 16; debug_token("EOB the next %d blocks\n", *eob_run); break; case 6: debug_token("DCT_REPEAT_RUN4_TOKEN, "); *eob_run = get_bits(gb, 12); debug_token("EOB the next %d blocks\n", *eob_run); break; case 7: debug_token("DCT_SHORT_ZRL_TOKEN, "); /* note that this token actually indicates that (3 extra bits) + 1 0s * should be output; this case specifies a run of (3 EBs) 0s and a * coefficient of 0. */ *zero_run = get_bits(gb, 3); *coeff = 0; debug_token("skip the next %d positions in output matrix\n", *zero_run + 1); break; case 8: debug_token("DCT_ZRL_TOKEN, "); /* note that this token actually indicates that (6 extra bits) + 1 0s * should be output; this case specifies a run of (6 EBs) 0s and a * coefficient of 0. */ *zero_run = get_bits(gb, 6); *coeff = 0; debug_token("skip the next %d positions in output matrix\n", *zero_run + 1); break; case 9: debug_token("ONE_TOKEN, output 1\n"); *coeff = 1; break; case 10: debug_token("MINUS_ONE_TOKEN, output -1\n"); *coeff = -1; break; case 11: debug_token("TWO_TOKEN, output 2\n"); *coeff = 2; break; case 12: debug_token("MINUS_TWO_TOKEN, output -2\n"); *coeff = -2; break; case 13: case 14: case 15: case 16: debug_token("LOW_VAL_TOKENS, "); if (get_bits(gb, 1)) *coeff = -(3 + (token - 13)); else *coeff = 3 + (token - 13); debug_token("output %d\n", *coeff); break; case 17: debug_token("DCT_VAL_CATEGORY3, "); sign = get_bits(gb, 1); *coeff = 7 + get_bits(gb, 1); if (sign) *coeff = -(*coeff); debug_token("output %d\n", *coeff); break; case 18: debug_token("DCT_VAL_CATEGORY4, "); sign = get_bits(gb, 1); *coeff = 9 + get_bits(gb, 2); if (sign) *coeff = -(*coeff); debug_token("output %d\n", *coeff); break; case 19: debug_token("DCT_VAL_CATEGORY5, "); sign = get_bits(gb, 1); *coeff = 13 + get_bits(gb, 3); if (sign) *coeff = -(*coeff); debug_token("output %d\n", *coeff); break; case 20: debug_token("DCT_VAL_CATEGORY6, "); sign = get_bits(gb, 1); *coeff = 21 + get_bits(gb, 4); if (sign) *coeff = -(*coeff); debug_token("output %d\n", *coeff); break; case 21: debug_token("DCT_VAL_CATEGORY7, "); sign = get_bits(gb, 1); *coeff = 37 + get_bits(gb, 5); if (sign) *coeff = -(*coeff); debug_token("output %d\n", *coeff); break; case 22: debug_token("DCT_VAL_CATEGORY8, "); sign = get_bits(gb, 1); *coeff = 69 + get_bits(gb, 9); if (sign) *coeff = -(*coeff); debug_token("output %d\n", *coeff); break; case 23: case 24: case 25: case 26: case 27: debug_token("DCT_RUN_CATEGORY1, "); *zero_run = token - 22; if (get_bits(gb, 1)) *coeff = -1; else *coeff = 1; debug_token("output %d 0s, then %d\n", *zero_run, *coeff); break; case 28: debug_token("DCT_RUN_CATEGORY1B, "); if (get_bits(gb, 1)) *coeff = -1; else *coeff = 1; *zero_run = 6 + get_bits(gb, 2); debug_token("output %d 0s, then %d\n", *zero_run, *coeff); break; case 29: debug_token("DCT_RUN_CATEGORY1C, "); if (get_bits(gb, 1)) *coeff = -1; else *coeff = 1; *zero_run = 10 + get_bits(gb, 3); debug_token("output %d 0s, then %d\n", *zero_run, *coeff); break; case 30: debug_token("DCT_RUN_CATEGORY2, "); sign = get_bits(gb, 1); *coeff = 2 + get_bits(gb, 1); if (sign) *coeff = -(*coeff); *zero_run = 1; debug_token("output %d 0s, then %d\n", *zero_run, *coeff); break; case 31: debug_token("DCT_RUN_CATEGORY2, "); sign = get_bits(gb, 1); *coeff = 2 + get_bits(gb, 1); if (sign) *coeff = -(*coeff); *zero_run = 2 + get_bits(gb, 1); debug_token("output %d 0s, then %d\n", *zero_run, *coeff); break; default: av_log(NULL, AV_LOG_ERROR, " vp3: help! Got a bad token: %d > 31\n", token); break; }}/* * This function wipes out all of the fragment data. */static void init_frame(Vp3DecodeContext *s, GetBitContext *gb){ int i; /* zero out all of the fragment information */ s->coded_fragment_list_index = 0; for (i = 0; i < s->fragment_count; i++) { memset(s->all_fragments[i].coeffs, 0, 64 * sizeof(DCTELEM)); s->all_fragments[i].coeff_count = 0; s->all_fragments[i].last_coeff = 0;s->all_fragments[i].motion_x = 0xbeef;s->all_fragments[i].motion_y = 0xbeef; }}/* * This function sets of the dequantization tables used for a particular * frame. */static void init_dequantizer(Vp3DecodeContext *s){ int quality_scale = s->coded_quality_threshold[s->quality_index]; int dc_scale_factor = s->coded_dc_scale_factor[s->quality_index]; int i, j; debug_vp3(" vp3: initializing dequantization tables\n"); /* * Scale dequantizers: * * quantizer * sf * -------------- * 100 * * where sf = dc_scale_factor for DC quantizer * or quality_scale for AC quantizer * * Then, saturate the result to a lower limit of MIN_DEQUANT_VAL. */#define SCALER 4 /* scale DC quantizers */ s->intra_y_dequant[0] = s->coded_intra_y_dequant[0] * dc_scale_factor / 100; if (s->intra_y_dequant[0] < MIN_DEQUANT_VAL * 2) s->intra_y_dequant[0] = MIN_DEQUANT_VAL * 2; s->intra_y_dequant[0] *= SCALER; s->intra_c_dequant[0] = s->coded_intra_c_dequant[0] * dc_scale_factor / 100; if (s->intra_c_dequant[0] < MIN_DEQUANT_VAL * 2) s->intra_c_dequant[0] = MIN_DEQUANT_VAL * 2; s->intra_c_dequant[0] *= SCALER; s->inter_dequant[0] = s->coded_inter_dequant[0] * dc_scale_factor / 100; if (s->inter_dequant[0] < MIN_DEQUANT_VAL * 4) s->inter_dequant[0] = MIN_DEQUANT_VAL * 4; s->inter_dequant[0] *= SCALER; /* scale AC quantizers, zigzag at the same time in preparation for * the dequantization phase */ for (i = 1; i < 64; i++) { j = zigzag_index[i]; s->intra_y_dequant[j] = s->coded_intra_y_dequant[i] * quality_scale / 100; if (s->intra_y_dequant[j] < MIN_DEQUANT_VAL) s->intra_y_dequant[j] = MIN_DEQUANT_VAL; s->intra_y_dequant[j] *= SCALER; s->intra_c_dequant[j] = s->coded_intra_c_dequant[i] * quality_scale / 100; if (s->intra_c_dequant[j] < MIN_DEQUANT_VAL) s->intra_c_dequant[j] = MIN_DEQUANT_VAL; s->intra_c_dequant[j] *= SCALER; s->inter_dequant[j] = s->coded_inter_dequant[i] * quality_scale / 100; if (s->inter_dequant[j] < MIN_DEQUANT_VAL * 2) s->inter_dequant[j] = MIN_DEQUANT_VAL * 2; s->inter_dequant[j] *= SCALER; } memset(s->qscale_table, (FFMAX(s->intra_y_dequant[1], s->intra_c_dequant[1])+8)/16, 512); //FIXME finetune /* print debug information as requested */ debug_dequantizers("intra Y dequantizers:\n"); for (i = 0; i < 8; i++) { for (j = i * 8; j < i * 8 + 8; j++) { debug_dequantizers(" %4d,", s->intra_y_dequant[j]); } debug_dequantizers("\n"); } debug_dequantizers("\n"); debug_dequantizers("intra C dequantizers:\n"); for (i = 0; i < 8; i++) { for (j = i * 8; j < i * 8 + 8; j++) { debug_dequantizers(" %4d,", s->intra_c_dequant[j]); } debug_dequantizers("\n"); } debug_dequantizers("\n"); debug_dequantizers("interframe dequantizers:\n"); for (i = 0; i < 8; i++) { for (j = i * 8; j < i * 8 + 8; j++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -