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