解码端的buffer

来源:互联网 发布:tomcat 域名 生效 编辑:程序博客网 时间:2024/06/06 17:54

1.m_cListPic和m_ivPicLists
这里写图片描述

  1. m_apiPicBufY和 m_apiPicBufY;
class TComPicYuv{     Pel*  m_apiPicBufY;  ///< Buffer (including margin)     Pel*  m_piPicOrgY;  ///< m_apiPicBufY + m_iMarginLuma*getStride() + m_iMarginLuma};

在Void TAppDecTop::decode()中的m_tDecTop[decIdx]->decode()后加入以下代码

if( pocCurrPic==8&&!newSliceDiffLayer&&nalu.m_layerId==0)        {            ofstream out("E:\\0.txt");            Pel depth;            int h= m_tDecTop[decIdx]->getPic(poc)->getSlice(0)->getSPS()->getPicHeightInLumaSamples();            int w=  m_tDecTop[decIdx]->getPic(poc)->getSlice(0)->getSPS()->getPicWidthInLumaSamples();            Pel* addr=m_tDecTop[decIdx]->getPic(poc)->getPicYuvRec()->getLumaAddr();            for (int y = 0; y <h; y++)                for (int x = 0; x < w;  x++)                {                                       depth=*addr;                    addr++;                         if (x==w-1)                    {                        addr=addr+160;                    }                    out<<"x="<<x<<"  "<<"y="<<y<<"     "<<depth<<endl;                }                ofstream out1("E:\\1.txt");                Pel depth1;                Pel* addr1=m_tDecTop[decIdx]->getPic(poc)->getPicYuvRec()->getBufY();                for (int y = -80; y <h+80; y++)                    for (int x =-80; x < w+80;  x++)                    {                                           depth1=*addr1;                        addr1++;                                out1<<"x="<<x<<"  "<<"y="<<y<<"     "<<depth1<<endl;                    }        }

以上代码的功能是:将没有扩展的值输出到0.txt;将扩展的值输出到1.txt

根据值的对比可以发现:
这里写图片描述

3.m_apiPicBufY是16-bit,而图像中每个像素点是8-bit

int h= apcPicYuvBaseVideo[iLeftBaseViewIdx ]->getHeight();int w=  apcPicYuvBaseVideo[iLeftBaseViewIdx ]->getWidth();int s=apcPicYuvBaseVideo[iLeftBaseViewIdx ]->getStride(); FILE *fp3 = fopen("E:\\new.yuv","wb");for (int j = 0 ; j<h; j++){  fwrite(pcPicYuvSynthOut->getLumaAddr()+j*s,1,w,fp3);}for (int j = 0 ; j<h/2; j++){  fwrite(pcPicYuvSynthOut->getCbAddr()+j*s/2,1,w/2,fp3);}for (int j = 0 ; j<h/2; j++){  fwrite(pcPicYuvSynthOut->getCrAddr()+j*s/2,1,w/2,fp3);}fclose(fp3);

以上错误,将代码修改如下:

int h= apcPicYuvBaseVideo[iLeftBaseViewIdx ]->getHeight();int w=  apcPicYuvBaseVideo[iLeftBaseViewIdx ]->getWidth();int s=apcPicYuvBaseVideo[iLeftBaseViewIdx ]->getStride(); FILE *fp3 = fopen("E:\\new.yuv","wb");unsigned char *tmpY = new unsigned char[w*h];unsigned char *tmpCb = new unsigned char[w*h/4];unsigned char *tmpCr = new unsigned char[w*h/4];for (int j = 0 ; j<h; j++)    for(int i=0;i<w;i++)  {    tmpY[i+j*w]=*(pcPicYuvSynthOut->getLumaAddr()+i+j*s);    tmpCb[i/2+j*w/4]=*(pcPicYuvSynthOut->getCbAddr()+i/2+j*s/4);    tmpCr[i/2+j*w/4]=*(pcPicYuvSynthOut->getCrAddr()+i/2+j*s/4);  }fwrite(tmpY,1,w*h,fp3);fwrite(tmpCb,1,w*h/4,fp3);fwrite(tmpCr,1,w*h/4,fp3); delete []tmpY;delete []tmpCb;delete []tmpCr;fclose(fp3);

因为getLumaAddr()返回的是Pel*型,且typedef Short Pel; ///< 16-bit pixel type

而图像中每个像素点是8-bit的,所以要先将getLumaAddr()中的值存入到unsigned char *tmpY中去,最后再将unsigned char *tmpY中的值赋值到fp3中。

0 0
原创粉丝点击