2009-10-29 3 views
1

Ceci est un extrait de code pour ajouter un logo à l'image YUV décodée (par ffmpeg). http://pastebin.com/md6c16c5Problème d'ajout d'un logo aux données vidéo décodées

Cela fonctionne presque. Un seul problème: parfois la carte du logo est fortement foiré avec la partie environnante. La chose la plus étrange est que parfois cela fonctionne bien mais parfois non.

Le code modifierait le AVFrame alloué par ffmpeg. Cela causerait-il le problème?

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; 
    } 
} 

Répondre