static int ReadHuffTree(HUFF_ENTRY * HuffRoot, int depth, oggpack_buffer *opb) { long bit; long ret; theora_read(opb,1,&bit); if(bit < 0) return OC_BADHEADER; else if(!bit) { int ret; if (++depth > 32) return OC_BADHEADER; HuffRoot->ZeroChild = (HUFF_ENTRY *)_ogg_calloc(1, sizeof(HUFF_ENTRY)); ret = ReadHuffTree(HuffRoot->ZeroChild, depth, opb); if (ret < 0) return ret; HuffRoot->OneChild = (HUFF_ENTRY *)_ogg_calloc(1, sizeof(HUFF_ENTRY)); ret = ReadHuffTree(HuffRoot->OneChild, depth, opb); if (ret < 0) return ret; HuffRoot->Value = -1; } else { HuffRoot->ZeroChild = NULL; HuffRoot->OneChild = NULL; theora_read(opb,5,&ret); HuffRoot->Value=ret;; if (HuffRoot->Value < 0) return OC_BADHEADER; } return 0; }
static void GetNextSbInit(PB_INSTANCE *pbi){ long ret; theora_read(pbi->opb,1,&ret); pbi->NextBit = (unsigned char)ret; /* Read run length */ FrArrayDeCodeInit(pbi); do theora_read(pbi->opb,1,&ret); while (FrArrayDeCodeSBRun(pbi,ret,&pbi->BitsLeft)==0); }
int ReadFilterTables(codec_setup_info *ci, oggpack_buffer *opb){ int i; int bits, value; theora_read(opb, 3, &bits); for(i=0;i<Q_TABLE_SIZE;i++){ theora_read(opb,bits,&value); ci->LoopFilterLimitValues[i]=value; } if(bits<0)return OC_BADHEADER; return 0; }
static void _tp_readlsbint(oggpack_buffer *opb, long *value) { int i; long ret[4]; for (i = 0; i < 4; i++) { theora_read(opb,8,&ret[i]); } *value = ret[0]|ret[1]<<8|ret[2]<<16|ret[3]<<24; }
static void _tp_readbuffer(oggpack_buffer *opb, char *buf, const long len) { long i; long ret; for (i = 0; i < len; i++) { theora_read(opb, 8, &ret); *buf++=(char)ret; } }
static unsigned char GetNextBBit (PB_INSTANCE *pbi){ long ret; if ( !pbi->BitsLeft ){ /* Toggle the value. */ pbi->NextBit = ( pbi->NextBit == 1 ) ? 0 : 1; /* Read next run */ FrArrayDeCodeInit(pbi); do theora_read(pbi->opb,1,&ret); while (FrArrayDeCodeBlockRun(pbi,ret,&pbi->BitsLeft)==0); } /* Have read a bit */ pbi->BitsLeft--; /* Return next bit value */ return pbi->NextBit; }
int theora_decode_packetin(theora_state *th,ogg_packet *op){ long ret; PB_INSTANCE *pbi=(PB_INSTANCE *)(th->internal_decode); pbi->DecoderErrorCode = 0; #ifndef LIBOGG2 oggpackB_readinit(pbi->opb,op->packet,op->bytes); #else oggpackB_readinit(pbi->opb,op->packet); #endif /* verify that this is a video frame */ theora_read(pbi->opb,1,&ret); if (ret==0) { ret=LoadAndDecode(pbi); if(ret)return ret; if(pbi->PostProcessingLevel) PostProcess(pbi); if(op->granulepos>-1) th->granulepos=op->granulepos; else{ if(th->granulepos==-1){ th->granulepos=0; }else{ if(pbi->FrameType==BASE_FRAME){ long frames= th->granulepos & ((1<<pbi->keyframe_granule_shift)-1); th->granulepos>>=pbi->keyframe_granule_shift; th->granulepos+=frames+1; th->granulepos<<=pbi->keyframe_granule_shift; }else th->granulepos++; }
int theora_decode_header(theora_info *ci, theora_comment *cc, ogg_packet *op){ long ret; oggpack_buffer *opb; if(!op)return OC_BADHEADER; #ifndef LIBOGG2 opb = _ogg_malloc(sizeof(oggpack_buffer)); oggpackB_readinit(opb,op->packet,op->bytes); #else opb = _ogg_malloc(oggpack_buffersize()); oggpackB_readinit(opb,op->packet); #endif { char id[6]; int typeflag; theora_read(opb,8,&ret); typeflag = ret; if(!(typeflag&0x80)) { free(opb); return(OC_NOTFORMAT); } _tp_readbuffer(opb,id,6); if(memcmp(id,"theora",6)) { free(opb); return(OC_NOTFORMAT); } switch(typeflag){ case 0x80: if(!op->b_o_s){ /* Not the initial packet */ free(opb); return(OC_BADHEADER); } if(ci->version_major!=0){ /* previously initialized info header */ free(opb); return OC_BADHEADER; } ret = _theora_unpack_info(ci,opb); free(opb); return(ret); case 0x81: if(ci->version_major==0){ /* um... we didn't get the initial header */ free(opb); return(OC_BADHEADER); } ret = _theora_unpack_comment(cc,opb); free(opb); return(ret); case 0x82: if(ci->version_major==0 || cc->vendor==NULL){ /* um... we didn't get the initial header or comments yet */ free(opb); return(OC_BADHEADER); } ret = _theora_unpack_tables(ci,opb); free(opb); return(ret); default: free(opb); if(ci->version_major==0 || cc->vendor==NULL || ((codec_setup_info *)ci->codec_setup)->HuffRoot[0]==NULL){ /* we haven't gotten the three required headers */ return(OC_BADHEADER); } /* ignore any trailing header packets for forward compatibility */ return(OC_NEWPACKET); } } /* I don't think it's possible to get this far, but better safe.. */ free(opb); return(OC_BADHEADER); }
static int _theora_unpack_info(theora_info *ci, oggpack_buffer *opb){ long ret; theora_read(opb,8,&ret); ci->version_major=(unsigned char)ret; theora_read(opb,8,&ret); ci->version_minor=(unsigned char)ret; theora_read(opb,8,&ret); ci->version_subminor=(unsigned char)ret; if(ci->version_major!=VERSION_MAJOR)return(OC_VERSION); if(ci->version_minor>VERSION_MINOR)return(OC_VERSION); theora_read(opb,16,&ret); ci->width=ret<<4; theora_read(opb,16,&ret); ci->height=ret<<4; theora_read(opb,24,&ret); ci->frame_width=ret; theora_read(opb,24,&ret); ci->frame_height=ret; theora_read(opb,8,&ret); ci->offset_x=ret; theora_read(opb,8,&ret); ci->offset_y=ret; theora_read(opb,32,&ret); ci->fps_numerator=ret; theora_read(opb,32,&ret); ci->fps_denominator=ret; theora_read(opb,24,&ret); ci->aspect_numerator=ret; theora_read(opb,24,&ret); ci->aspect_denominator=ret; theora_read(opb,8,&ret); ci->colorspace=ret; theora_read(opb,24,&ret); ci->target_bitrate=ret; theora_read(opb,6,&ret); ci->quality=ret=ret; theora_read(opb,5,&ret); ci->keyframe_frequency_force=1<<ret; /* spare configuration bits */ if ( theora_read(opb,5,&ret) == -1 ) return (OC_BADHEADER); return(0); }
CODING_MODE FrArrayUnpackMode(PB_INSTANCE *pbi){ long ret; /* Coding scheme: Token Codeword Bits Entry 0 (most frequent) 0 1 Entry 1 10 2 Entry 2 110 3 Entry 3 1110 4 Entry 4 11110 5 Entry 5 111110 6 Entry 6 1111110 7 Entry 7 1111111 7 */ /* Initialise the decoding. */ pbi->bits_so_far = 0; theora_read(pbi->opb,1,&ret); pbi->bit_pattern = ret; /* Do we have a match */ if ( pbi->bit_pattern == 0 ) return (CODING_MODE)0; /* Get the next bit */ theora_read(pbi->opb,1,&ret); pbi->bit_pattern = (pbi->bit_pattern << 1) | ret; /* Do we have a match */ if ( pbi->bit_pattern == 0x0002 ) return (CODING_MODE)1; theora_read(pbi->opb,1,&ret); pbi->bit_pattern = (pbi->bit_pattern << 1) | ret; /* Do we have a match */ if ( pbi->bit_pattern == 0x0006 ) return (CODING_MODE)2; theora_read(pbi->opb,1,&ret); pbi->bit_pattern = (pbi->bit_pattern << 1) | ret; /* Do we have a match */ if ( pbi->bit_pattern == 0x000E ) return (CODING_MODE)3; theora_read(pbi->opb,1,&ret); pbi->bit_pattern = (pbi->bit_pattern << 1) | ret; /* Do we have a match */ if ( pbi->bit_pattern == 0x001E ) return (CODING_MODE)4; theora_read(pbi->opb,1,&ret); pbi->bit_pattern = (pbi->bit_pattern << 1) | ret; /* Do we have a match */ if ( pbi->bit_pattern == 0x003E ) return (CODING_MODE)5; theora_read(pbi->opb,1,&ret); pbi->bit_pattern = (pbi->bit_pattern << 1) | ret; /* Do we have a match */ if ( pbi->bit_pattern == 0x007E ) return (CODING_MODE)6; else return (CODING_MODE)7; }
static int _theora_unpack_info(theora_info *ci, oggpack_buffer *opb){ long ret; theora_read(opb,8,&ret); ci->version_major=(unsigned char)ret; theora_read(opb,8,&ret); ci->version_minor=(unsigned char)ret; theora_read(opb,8,&ret); ci->version_subminor=(unsigned char)ret; theora_read(opb,16,&ret); ci->width=ret<<4; theora_read(opb,16,&ret); ci->height=ret<<4; theora_read(opb,24,&ret); ci->frame_width=ret; theora_read(opb,24,&ret); ci->frame_height=ret; theora_read(opb,8,&ret); ci->offset_x=ret; theora_read(opb,8,&ret); ci->offset_y=ret; theora_read(opb,32,&ret); ci->fps_numerator=ret; theora_read(opb,32,&ret); ci->fps_denominator=ret; theora_read(opb,24,&ret); ci->aspect_numerator=ret; theora_read(opb,24,&ret); ci->aspect_denominator=ret; theora_read(opb,8,&ret); ci->colorspace=ret; theora_read(opb,24,&ret); ci->target_bitrate=ret; theora_read(opb,6,&ret); ci->quality=ret; theora_read(opb,5,&ret); ci->granule_shift = ret; theora_read(opb,2,&ret); ci->pixelformat=ret; /* spare configuration bits */ if ( theora_read(opb,3,&ret) == -1 ) return (OC_BADHEADER); return(0); }