Hi,
 
I'd like to write a simple directshow mpeg decoder filter using libavcodec.
My filter class's (inherited from CVideoTransformFilter) Transform method calls 
following function for 
everty input media sample.
But when I run graphedit, only the first frame appears and don't move at all.
How should I do decode next frames and display it?
 
Thanks in advance.
 
Pathos
 
 
HRESULT CLibAVCodec::Decompress(uint8_t *src, size_t srcLen, uint8_t *out, 
size_t *outlen)
{
    int size = srcLen;
    while (!src || size > 0)
    {
         int got_picture, used_bytes;

         unsigned int neededsize = size + FF_INPUT_BUFFER_PADDING_SIZE;
         if (ffbuflen < neededsize)
             ffbuf = (unsigned char *) realloc(ffbuf, ffbuflen = neededsize);
         
         if (src) 
        {
             memcpy(ffbuf, src, size);
             memset(ffbuf + srcLen, 0, FF_INPUT_BUFFER_PADDING_SIZE);
             used_bytes = avcodec_decode_video(avctx, frame, &got_picture, 
ffbuf, size);
         }
        else 
             used_bytes = avcodec_decode_video(avctx, frame, &got_picture, 
NULL, 0); 
        
        if (used_bytes < 0)
             break;
        if (got_picture && frame->data[0])
       {
             uint8_t *dest[3];
             dest[0] = out;
             dest[2] = dest[0] + stride * height;
             dest[1] = dest[2] + stride * (height >> 2);
             
             for (int i = 0; i < height >> 1; i++) 
             {
                  CopyMemory (dest[0], frame->data[0] + 2 * i * 
frame->linesize[0], frame->linesize[0]);
                  dest[0] += stride;
                  CopyMemory (dest[0], frame->data[0] + (2 * i + 1) * 
frame->linesize[0], frame->linesize[0]);
                  dest[0] += stride;
                  CopyMemory (dest[1], frame->data[1] + i * frame->linesize[1], 
frame->linesize[1]);
                  dest[1] += stride >> 1;
                  CopyMemory (dest[2], frame->data[2] + i * frame->linesize[2], 
frame->linesize[1]);
                  dest[2] += stride >> 1;
              } 

              
              *outlen = height * stride * 3 / 2;
              
              return S_OK;
          }
          else 
               if (!src) break;
          
          src += used_bytes;
          size -= used_bytes;
       }
      
      *outlen = 0;
      return S_FALSE;
}
 
 
_________________________________________________________________
The other season of giving begins 6/24/08. Check out the i’m Talkathon.
http://www.imtalkathon.com?source=TXT_EML_WLH_SeasonOfGiving
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to