⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vp3.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 5 页
字号:
            } 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 + -