static void check_stream_type(APEG_LAYER *layer) { // Assume a non-system stream layer->system_stream_flag = NO_SYSTEM; // Initialize the buffer _apeg_initialize_buffer(layer); // Transport streams (what'r those?) aren't supported if(show_bits(layer, 8) == 0x47) apeg_error_jump("Transport streams not supported"); /* Get the first start code */ recheck: switch(show_bits32(layer)) { case VIDEO_ELEMENTARY_STREAM: /* Found video, system stream */ layer->system_stream_flag = MPEG_SYSTEM; /* fall-through; set flag and break */ case SEQUENCE_HEADER_CODE: /* Found video */ if(!_apeg_ignore_video) layer->stream.flags |= APEG_MPG_VIDEO; break; case AUDIO_ELEMENTARY_STREAM: /* apeg_start_audio will set APEG_MPG_AUDIO later */ layer->system_stream_flag = MPEG_SYSTEM; apeg_start_code(layer); goto recheck; default: if(layer->system_stream_flag == NO_SYSTEM) { if(show_bits32(layer) == (('O'<<24)|('g'<<16)|('g'<<8)|('S'))) { layer->system_stream_flag = OGG_SYSTEM; _apeg_initialize_buffer(layer); if(alogg_open(layer) != APEG_OK) apeg_error_jump("Error opening Ogg stream"); return; } #ifndef DISABLE_MPEG_AUDIO if(almpa_head_backcheck(show_bits32(layer))) break; #endif } /* no positive stream identified; recheck */ apeg_flush_bits8(layer, 8); goto recheck; } _apeg_initialize_buffer(layer); }
static int Get_Chroma_DC_dct_diff(APEG_LAYER *layer) { int code, size; /* decode length */ code = show_bits(layer, 5); if (code<31) { /* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */ static const VLCtab DCchromtab0[32] = { {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {0, 0} }; size = DCchromtab0[code].val; apeg_flush_bits8(layer, DCchromtab0[code].len); if(size == 0) return 0; } else { /* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */ static const VLCtab DCchromtab1[32] = { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, { 6, 6}, { 6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, { 6, 6}, { 6, 6}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, { 7, 7}, { 7, 7}, {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10} }; code = show_bits(layer, 10) - 992; size = DCchromtab1[code].val; apeg_flush_bits(layer, DCchromtab1[code].len); } { const int dct_diff = apeg_get_bits(layer, size); const int f = ((dct_diff >> (size-1))&1)^1; return dct_diff - ((f<<size) - f); /* int dct_diff = apeg_get_bits(layer, size); if (( dct_diff & (1 << (size-1)) ) == 0) return dct_diff - ((1<<size) - 1); return dct_diff;*/ } }
static void p_picture(APEG_LAYER *layer) { const int MBAmax = layer->mb_cols*layer->mb_rows; int macroblock_type; int coded_block_pattern; int MBA, MBAinc; int dc_dct_pred[3]; int PMV[2]; int bx, by; unsigned int code; slice_start: dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0; PMV[0] = PMV[1] = 0; code = apeg_start_code(layer); if(code < SLICE_START_CODE_MIN || code > SLICE_START_CODE_MAX) return; apeg_flush_bits32(layer); slice_header(layer); bx = get_mba_inc(layer); by = (code&255) - 1; MBA = by*layer->mb_cols + bx; bx <<= 4; by <<= 4; block_start: code = show_bits(layer, 6); if(code >= 8) { code >>= 3; apeg_flush_bits8(layer, PMBtab0[code].len); macroblock_type = PMBtab0[code].val; dc_dct_pred[0] = dc_dct_pred[1] = dc_dct_pred[2] = 0; switch(macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN)) { case MACROBLOCK_MOTION_FORWARD|MACROBLOCK_PATTERN: apeg_motion_vector(layer,PMV,forward_code,full_forward_vector); apeg_form_f_pred(layer, bx, by, PMV); break; case MACROBLOCK_PATTERN: PMV[0] = PMV[1] = 0; apeg_empty_pred(layer->forward_frame, layer->current_frame, bx, by, layer->coded_width); break; default: apeg_motion_vector(layer,PMV,forward_code,full_forward_vector); apeg_form_f_pred(layer, bx, by, PMV); goto next; } }