Keith,
I am decoding real-time mpeg2 data, not mpeg file. so I can not provide the
mpeg2 file.
and I package libmpeg2 codec into windows dirctshow filter, and source code as
follows:
The Transform function is recall repeatly under real time capture stream data.
It can decoder mpeg2 file correctly ,but real-time data wrong.
HRESULT CMPEG2Decomp::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
BYTE *pBufferIn, *pBufferOut;
long inputLen = pIn->GetActualDataLength();
HRESULT hr = pIn->GetPointer(&pBufferIn);//pBufferIn is mpeg2 data input.
it includes header data or one frame data or multi-frame data.
hr = pOut->GetPointer(&pBufferOut);//pBufferOut is output data
do
{
state = mpeg2_parse (decoder);
sequence = info->sequence;
//bMem: 0--memory is uncopied
// 1--memory is copied
// 2--need read new memory data
//
switch (state)
{
case STATE_BUFFER:
if(bMem==1)
bMem=2;
if(bMem==0)
{
memcpy(buffer,pBufferIn,inputLen);
bMem=1;
mpeg2_buffer (decoder, buffer, buffer + inputLen);
}
break;
case STATE_SEQUENCE:
mpeg2_custom_fbuf (decoder, 1);
for (i = 0; i < 3; i++)
{
fbuf[i].mbuf[0] = (uint8_t *) malloc
(info->sequence->width*info->sequence->height + 15);
fbuf[i].mbuf[1] = (uint8_t *) malloc
(info->sequence->chroma_width*info->sequence->chroma_height + 15);
fbuf[i].mbuf[2] = (uint8_t *) malloc
(info->sequence->chroma_width*info->sequence->chroma_height + 15);
for (j = 0; j < 3; j++)
fbuf[i].yuv[j] = (unsigned char *)ALIGN_16
(fbuf[i].mbuf[j]);
fbuf[i].used = 0;
}
for (i = 0; i < 2; i++)
{
current_fbuf = get_fbuf ();
mpeg2_set_buf (decoder, current_fbuf->yuv,
current_fbuf);
}
break;
case STATE_PICTURE:
current_fbuf = get_fbuf ();
mpeg2_set_buf (decoder, current_fbuf->yuv, current_fbuf);
break;
case STATE_SLICE:
case STATE_END:
case STATE_INVALID_END:
if (info->display_fbuf)
{
if(pBufferIn != NULL)
{
//convert YUV420 data into BMP24 format
Convert( info->display_fbuf->buf[0],
info->display_fbuf->buf[1],info->display_fbuf->buf[2],pBufferOut);
pOut->SetActualDataLength(info->sequence->width*info->sequence->height*3);//sets
the sample's data length.
pOut->SetSyncPoint(TRUE);//output data to display
}
}
if (info->discard_fbuf)
((struct fbuf_s *)info->discard_fbuf->id)->used = 0;
break;
default:
break;
}//end switch
} while (bMem!=2);
return S_OK;
}
在2007-04-25,"Keith Winstein" <[EMAIL PROTECTED]> 写道:
Allison,
I have no idea. Please post the file somewhere or we won't be able to help
you.
-Keith
On Wed, 25 Apr 2007, hdzhang wrote:
> Keith,
>
> I used a "MPEG push demultiplexer".
>
> Is data from this demultiplexer TS or ES?
>
>
> Allison
>
> 在2007-04-25,"Keith Winstein" <[EMAIL PROTECTED]> 写道:
>
> Hello,
>
> Can you please post a section of this file on the Internet so we can
> examine it? Maybe you've got a transport stream instead of an elementary
> stream or something like that.
>
> -Keith
>
> On Wed, 25 Apr 2007, hdzhang wrote:
>
>> hi, now I receive mpeg2 data from satelite receiver.
>> But when I run mpeg2 codec ,I found it only can recognize STATE_BUFFER, can
>> not recognize STATE_SEQUENCE or STATE_PICTURE. So it can not decoder
>> picture correctly.
>> Why ? is the format of data received by satelite receiver not the same with
>> data from MPEG2 file?
>>
>
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Libmpeg2-devel mailing list
Libmpeg2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libmpeg2-devel