static void Picture( mpeg_decode* dec ) { static const int16_t aspect[16] = { 0,10000, 6735, 7031, 7615, 8055, 8437, 8935, 9157, 9815,10255,10695, 10950,11575,12015, 0, }; if (!dec->Codec.In.Format.Format.Video.Aspect && aspect[dec->aspect]) dec->Codec.In.Format.Format.Video.Aspect = Scale(ASPECT_ONE,10000,aspect[dec->aspect]); CodecIDCTSetFormat(&dec->Codec,PF_YUV420,dec->width,dec->height,dec->width,dec->height,dec->Codec.In.Format.Format.Video.Aspect); flushbits(dec,10); // temporal ref loadbits(dec); dec->prediction_type = getbits(dec,3); flushbits(dec,16); // non constant bit rate loadbits(dec); if (dec->prediction_type == P_VOP || dec->prediction_type == B_VOP) { dec->full_pixel[0] = getbits(dec,1); dec->fcode[0] = getbits(dec,3)-1; } if (dec->prediction_type == B_VOP) { dec->full_pixel[1] = getbits(dec,1); dec->fcode[1] = getbits(dec,3)-1; } dec->frame_state = 1; DEBUG_MSG1(DEBUG_VCODEC,T("MPEG Picture:%d"),dec->prediction_type); }
static void Sequence( mpeg_decode* dec ) { int i; loadbits(dec); dec->width = getbits(dec,12); dec->height = getbits(dec,12); loadbits(dec); dec->aspect = getbits(dec,4); dec->Codec.In.Format.PacketRate.Den = 1001; dec->Codec.In.Format.PacketRate.Num = FrameRate[getbits(dec,4)]; dec->Codec.FrameTime = Scale(TICKSPERSEC,dec->Codec.In.Format.PacketRate.Den,dec->Codec.In.Format.PacketRate.Num); loadbits(dec); dec->Codec.In.Format.ByteRate = getbits(dec,18) * 50; if (dec->Codec.In.Format.ByteRate > 8*1024*1024) dec->Codec.In.Format.ByteRate = 0; flushbits(dec,1); // marker flushbits(dec,10); // vbv_buffer_size flushbits(dec,1); loadbits(dec); if (getbits1(dec)) { for (i=0;i<64;i++) { loadbits(dec); dec->IntraMatrix[i] = (uint8_t)getbits(dec,8); } } else { for (i=0;i<64;i++) dec->IntraMatrix[i] = MPEG1_IntraMatrix[dec->zigzag[i]]; } if (getbits1(dec)) { for (i=0;i<64;i++) { loadbits(dec); dec->InterMatrix[i] = (uint8_t)getbits(dec, 8); } } else { for (i=0;i<64;i++) dec->InterMatrix[i] = 16; } dec->ValidSeq = 1; }
int gethdr_h263( mp4_decode *dec ) { int code; bytealign(dec); loadbits(dec); code = getbits(dec,22-8); while (!eofbits(dec)) { loadbits(dec); code = ((code << 8) + getbits(dec,8)) & 0x3FFFFF; if (code == 32) break; } if (code != 32) return 0; flushbits(dec,8); // picture timestamp loadbits(dec); if (!getbits1(dec)) // marker return 0; if (getbits1(dec)) // h263 id return 0; flushbits(dec,3); code = getbits(dec,3); // format if (code == 6 || code == 7) { if (dec->showerror) { dec->showerror = 0; ShowError(dec->Codec.Node.Class,MPEG4_ID,MPEG4_ERROR_H263); } //todo: finish return 0; } else { static const int size[8][2] = { { 0,0 }, { 128,96 }, { 176,144 }, { 352,288 }, { 704,576 }, { 1408,1152 }}; int width = size[code][0]; int height = size[code][1]; if (!dec->ignoresize && (!width || CodecIDCTSetFormat(&dec->Codec,PF_YUV420, dec->Codec.In.Format.Video.Width,dec->Codec.In.Format.Video.Height,width,height) != ERR_NONE)) { dec->validvol = 0; return 0; } loadbits(dec); dec->prediction_type = getbits(dec,1); dec->long_vectors = (char)getbits(dec,1); if (getbits1(dec)) // sac not supported return 0; getbits(dec,1); // obmc if (getbits1(dec)) // pb frame not supported return 0; dec->quantizer = getbits(dec,5); flushbits(dec,1); dec->rounding = 0; } while (getbits1(dec)) // pei { flushbits(dec,8); loadbits(dec); } dec->fcode_for = 1; dec->validvol = 1; dec->Codec.IDCT.Ptr->Set(dec->Codec.IDCT.Ptr,IDCT_ROUNDING,&dec->rounding,sizeof(bool_t)); return 1; }
static void blockIntra( mpeg_decode* dec, int pos ) { int j; idct_block_t *block; const uint16_t *table = vld_mpeg1; int qscale; dec->Codec.IDCT.Ptr->Process(dec->Codec.IDCT.Ptr,POSX(pos),POSY(pos)); block = dec->blockptr; qscale = dec->qscale; for (j=0;j<6;++j) { int bitpos; int len; ClearBlock(block); loadbits(dec); { int dct_dc_size, dct_dc_diff; dct_dc_diff = 0; dct_dc_size = j<4 ? getDCsizeLum(dec) : getDCsizeChr(dec); //max11bit if (dct_dc_size) dct_dc_diff = getDCdiff(dct_dc_size,dec); dct_dc_size = j<4 ? 0 : j-4+1; DEBUG_MSG2(DEBUG_VCODEC2,T("dc=%d diff=%d"), dec->last_dc[dct_dc_size]+dct_dc_diff, dct_dc_diff ); dct_dc_diff += dec->last_dc[dct_dc_size]; dec->last_dc[dct_dc_size] = dct_dc_diff; *block = (idct_block_t)(dct_dc_diff << 3); len = 1; } bitpos = dec->bitpos; for (;;) // event vld { int code,level; loadbits_pos(dec,bitpos); code = showbits_pos(dec,bitpos,16); vld_code; level = code & 63; if (level < 62) { level *= qscale; code >>= 6; code &= 63; len += code; // run if (len >= 64) break; code = dec->zigzag[len]; level *= dec->IntraMatrix[len]; level >>= 3; level = (level-1)|1; if (getbits1_pos(dec,bitpos)) level = -level; block[code] = (idct_block_t)level; ++len; } else { if (level==63) break; // this value is escaped loadbits_pos(dec,bitpos); len += showbits_pos(dec,bitpos,6); flushbits_pos(dec,bitpos,6); if (len >= 64) break; code = showbits_pos(dec,bitpos,8); flushbits_pos(dec,bitpos,8); level = (code << 24) >> 24; //sign extend the lower 8 bits code = dec->zigzag[len]; if (level == -128) { level = showbits_pos(dec,bitpos,8)-256; flushbits_pos(dec,bitpos,8); } else if (level == 0) { level = showbits_pos(dec,bitpos,8); flushbits_pos(dec,bitpos,8); } if (level<0) { level= -level; level *= qscale * dec->IntraMatrix[len]; level >>= 3; level= (level-1)|1; level= -level; block[code] = (idct_block_t)level; ++len; } else {