2009-10-29 55 views
1

這是一個代碼片段,用於爲解碼後的YUV圖片 (由ffmpeg)添加徽標。 http://pastebin.com/md6c16c5向解碼後的視頻數據添加徽標的問題

它幾乎可以工作。只有一個問題:有時徽標的棋盤會與周圍的部分嚴重混淆。最奇怪的是,有時它可以正常工作,但有時它不會。

該代碼將修改由ffmpeg分配的AVFrame。會導致問題嗎?

void OsdLogo(AVFrame* picture, unsigned char *pBufLogo, int xPos, int yPos) 
{ 
    unsigned char * pYBuf = picture->data[0]; 
    unsigned char * pUBuf  = picture->data[1]; 
    unsigned char * pVBuf  = picture->data[2]; 
    unsigned char * pBufLogoY = pBufLogo; 
    unsigned char * pBufLogoU = pBufLogo+180*52; 
    unsigned char * pBufLogoV = pBufLogoU+180*52/4; 
    int i,j; 
    if ((xPos&0x01)!=0) 
    { 
     xPos&=(~0x01); 
    } 
    if ((yPos&0x01)!=0) 
    { 
     yPos&=(~0x01); 
    } 
    pYBuf+=(yPos*picture->linesize[0]+xPos); 
    pUBuf+=(yPos*picture->linesize[0]/4+xPos/2); 
    pVBuf+=(yPos*picture->linesize[0]/4+xPos/2); 
    for (i=0; i < 52 ; i+=2) 
    { 
     for(j=0; j < 180 ; j+=2) 
     { 
      if ((*pBufLogo)<205) 
      { 
       //Y 
       *(pYBuf+picture->linesize[0]) = *(pBufLogo); 
       *pYBuf++ = *pBufLogo; 
       *(pYBuf+picture->linesize[0]) = *(pBufLogo); 
       *pYBuf++ = *pBufLogo; 
       //U 
       (*pUBuf++) =(*pBufLogoU++); 
       //V 
       (*pVBuf++) =(*pBufLogoV++); 
      } 
      else 
      { 
       pYBuf+=2; 
       pUBuf++; 
       pVBuf++; 
       pBufLogoU++; 
       pBufLogoV++; 
      } 
      pBufLogo+=2; 
     } 
     pYBuf+=(picture->linesize[0]-180+picture->linesize[0]); 
     pUBuf+=((picture->linesize[0]-180)/2); 
     pVBuf+=((picture->linesize[0]-180)/2); 
     pBufLogo+=180; 
    } 
} 

回答