void oc_theora_info2th_info(th_info *_info,const theora_info *_ci){ _info->version_major=_ci->version_major; _info->version_minor=_ci->version_minor; _info->version_subminor=_ci->version_subminor; _info->frame_width=_ci->width; _info->frame_height=_ci->height; _info->pic_width=_ci->frame_width; _info->pic_height=_ci->frame_height; _info->pic_x=_ci->offset_x; _info->pic_y=_ci->offset_y; _info->fps_numerator=_ci->fps_numerator; _info->fps_denominator=_ci->fps_denominator; _info->aspect_numerator=_ci->aspect_numerator; _info->aspect_denominator=_ci->aspect_denominator; switch(_ci->colorspace){ case OC_CS_ITU_REC_470M:_info->colorspace=TH_CS_ITU_REC_470M;break; case OC_CS_ITU_REC_470BG:_info->colorspace=TH_CS_ITU_REC_470BG;break; default:_info->colorspace=TH_CS_UNSPECIFIED;break; } switch(_ci->pixelformat){ case OC_PF_420:_info->pixel_fmt=TH_PF_420;break; case OC_PF_422:_info->pixel_fmt=TH_PF_422;break; case OC_PF_444:_info->pixel_fmt=TH_PF_444;break; default:_info->pixel_fmt=TH_PF_RSVD; } _info->target_bitrate=_ci->target_bitrate; _info->quality=_ci->quality; _info->keyframe_granule_shift=_ci->keyframe_frequency_force>0? OC_MINI(31,oc_ilog(_ci->keyframe_frequency_force-1)):0; }
int oc_quant_params_unpack(oc_pack_buf *_opb,th_quant_info *_qinfo){ th_quant_base *base_mats; long val; int nbase_mats; int sizes[64]; int indices[64]; int nbits; int bmi; int ci; int qti; int pli; int qri; int qi; int i; val=oc_pack_read(_opb,3); nbits=(int)val; for(qi=0;qi<64;qi++){ val=oc_pack_read(_opb,nbits); _qinfo->loop_filter_limits[qi]=(unsigned char)val; } val=oc_pack_read(_opb,4); nbits=(int)val+1; for(qi=0;qi<64;qi++){ val=oc_pack_read(_opb,nbits); _qinfo->ac_scale[qi]=(ogg_uint16_t)val; } val=oc_pack_read(_opb,4); nbits=(int)val+1; for(qi=0;qi<64;qi++){ val=oc_pack_read(_opb,nbits); _qinfo->dc_scale[qi]=(ogg_uint16_t)val; } val=oc_pack_read(_opb,9); nbase_mats=(int)val+1; base_mats=_ogg_malloc(nbase_mats*sizeof(base_mats[0])); if(base_mats==NULL)return TH_EFAULT; for(bmi=0;bmi<nbase_mats;bmi++){ for(ci=0;ci<64;ci++){ val=oc_pack_read(_opb,8); base_mats[bmi][ci]=(unsigned char)val; } } nbits=oc_ilog(nbase_mats-1); for(i=0;i<6;i++){ th_quant_ranges *qranges; th_quant_base *qrbms; int *qrsizes; qti=i/3; pli=i%3; qranges=_qinfo->qi_ranges[qti]+pli; if(i>0){ val=oc_pack_read1(_opb); if(!val){ int qtj; int plj; if(qti>0){ val=oc_pack_read1(_opb); if(val){ qtj=qti-1; plj=pli; } else{ qtj=(i-1)/3; plj=(i-1)%3; } } else{ qtj=(i-1)/3; plj=(i-1)%3; } *qranges=*(_qinfo->qi_ranges[qtj]+plj); continue; } } val=oc_pack_read(_opb,nbits); indices[0]=(int)val; for(qi=qri=0;qi<63;){ val=oc_pack_read(_opb,oc_ilog(62-qi)); sizes[qri]=(int)val+1; qi+=(int)val+1; val=oc_pack_read(_opb,nbits); indices[++qri]=(int)val; } /*Note: The caller is responsible for cleaning up any partially constructed qinfo.*/ if(qi>63){ _ogg_free(base_mats); return TH_EBADHEADER; } qranges->nranges=qri; qranges->sizes=qrsizes=(int *)_ogg_malloc(qri*sizeof(qrsizes[0])); if(qranges->sizes==NULL){ /*Note: The caller is responsible for cleaning up any partially constructed qinfo.*/ _ogg_free(base_mats); return TH_EFAULT; } memcpy(qrsizes,sizes,qri*sizeof(qrsizes[0])); qrbms=(th_quant_base *)_ogg_malloc((qri+1)*sizeof(qrbms[0])); if(qrbms==NULL){ /*Note: The caller is responsible for cleaning up any partially constructed qinfo.*/ _ogg_free(base_mats); return TH_EFAULT; } qranges->base_matrices=(const th_quant_base *)qrbms; do{ bmi=indices[qri]; /*Note: The caller is responsible for cleaning up any partially constructed qinfo.*/ if(bmi>=nbase_mats){ _ogg_free(base_mats); return TH_EBADHEADER; } memcpy(qrbms[qri],base_mats[bmi],sizeof(qrbms[qri])); } while(qri-->0); } _ogg_free(base_mats); return 0; }
int oc_quant_params_unpack(oggpack_buffer *_opb, th_quant_info *_qinfo){ th_quant_base *base_mats; long val; int nbase_mats; int sizes[64]; int indices[64]; int nbits; int bmi; int ci; int qti; int pli; int qri; int qi; int i; theorapackB_read(_opb,3,&val); nbits=(int)val; for(qi=0;qi<64;qi++){ theorapackB_read(_opb,nbits,&val); _qinfo->loop_filter_limits[qi]=(unsigned char)val; } theorapackB_read(_opb,4,&val); nbits=(int)val+1; for(qi=0;qi<64;qi++){ theorapackB_read(_opb,nbits,&val); _qinfo->ac_scale[qi]=(ogg_uint16_t)val; } theorapackB_read(_opb,4,&val); nbits=(int)val+1; for(qi=0;qi<64;qi++){ theorapackB_read(_opb,nbits,&val); _qinfo->dc_scale[qi]=(ogg_uint16_t)val; } theorapackB_read(_opb,9,&val); nbase_mats=(int)val+1; base_mats=_ogg_malloc(nbase_mats*sizeof(base_mats[0])); for(bmi=0;bmi<nbase_mats;bmi++){ for(ci=0;ci<64;ci++){ theorapackB_read(_opb,8,&val); base_mats[bmi][ci]=(unsigned char)val; } } nbits=oc_ilog(nbase_mats-1); for(i=0;i<6;i++){ th_quant_ranges *qranges; th_quant_base *qrbms; int *qrsizes; qti=i/3; pli=i%3; qranges=_qinfo->qi_ranges[qti]+pli; if(i>0){ theorapackB_read1(_opb,&val); if(!val){ int qtj; int plj; if(qti>0){ theorapackB_read1(_opb,&val); if(val){ qtj=qti-1; plj=pli; } else{ qtj=(i-1)/3; plj=(i-1)%3; } } else{ qtj=(i-1)/3; plj=(i-1)%3; } *qranges=*(_qinfo->qi_ranges[qtj]+plj); continue; } } theorapackB_read(_opb,nbits,&val); indices[0]=(int)val; for(qi=qri=0;qi<63;){ theorapackB_read(_opb,oc_ilog(62-qi),&val); sizes[qri]=(int)val+1; qi+=(int)val+1; theorapackB_read(_opb,nbits,&val); indices[++qri]=(int)val; } /*Note: The caller is responsible for cleaning up any partially constructed qinfo.*/ if(qi>63){ _ogg_free(base_mats); return TH_EBADHEADER; } qranges->nranges=qri; qranges->sizes=qrsizes=(int *)_ogg_malloc(qri*sizeof(qrsizes[0])); memcpy(qrsizes,sizes,qri*sizeof(qrsizes[0])); qrbms=(th_quant_base *)_ogg_malloc((qri+1)*sizeof(qrbms[0])); qranges->base_matrices=(const th_quant_base *)qrbms; do{ bmi=indices[qri]; /*Note: The caller is responsible for cleaning up any partially constructed qinfo.*/ if(bmi>=nbase_mats){ _ogg_free(base_mats); return TH_EBADHEADER; } memcpy(qrbms[qri],base_mats[bmi],sizeof(qrbms[qri])); } while(qri-->0); } #ifdef _TH_DEBUG_ /* dump the tables */ { int i, j, k, l, m; TH_DEBUG("loop filter limits = {"); for(i=0;i<64;){ TH_DEBUG("\n "); for(j=0;j<16;i++,j++) TH_DEBUG("%3d ",_qinfo->loop_filter_limits[i]); } TH_DEBUG("\n}\n\n"); TH_DEBUG("ac scale = {"); for(i=0;i<64;){ TH_DEBUG("\n "); for(j=0;j<16;i++,j++) TH_DEBUG("%3d ",_qinfo->ac_scale[i]); } TH_DEBUG("\n}\n\n"); TH_DEBUG("dc scale = {"); for(i=0;i<64;){ TH_DEBUG("\n "); for(j=0;j<16;i++,j++) TH_DEBUG("%3d ",_qinfo->dc_scale[i]); } TH_DEBUG("\n}\n\n"); for(k=0;k<2;k++) for(l=0;l<3;l++){ char *name[2][3]={ {"intra Y bases","intra U bases", "intra V bases"}, {"inter Y bases","inter U bases", "inter V bases"} }; th_quant_ranges *r = &_qinfo->qi_ranges[k][l]; TH_DEBUG("%s = {\n",name[k][l]); TH_DEBUG(" ranges = %d\n",r->nranges); TH_DEBUG(" intervals = { "); for(i=0;i<r->nranges;i++) TH_DEBUG("%3d ",r->sizes[i]); TH_DEBUG("}\n"); TH_DEBUG("\n matricies = { "); for(m=0;m<r->nranges+1;m++){ TH_DEBUG("\n { "); for(i=0;i<64;){ TH_DEBUG("\n "); for(j=0;j<8;i++,j++) TH_DEBUG("%3d ",r->base_matrices[m][i]); } TH_DEBUG("\n }"); } TH_DEBUG("\n }\n"); } } #endif _ogg_free(base_mats); return 0; }
int theora_granule_shift(theora_info *_ci){ /*This breaks when keyframe_frequency_force is not positive or is larger than 2**31 (if your int is more than 32 bits), but that's what the original function does.*/ return oc_ilog(_ci->keyframe_frequency_force-1); }