rendered paste bodyvoid FileReader::DecodeFrame()
{
if(m_sState == Status_Stopped)
return -1;
/* Decode frame, and store in frame buffer */
while(av_read_frame(m_pFormatCtx, &m_sPacket) >= 0)
{
if(m_sPacket.stream_index == m_lVideoStream)
{
int fDecodedFrame = 0;
int bytesRemaining = 0;
bytesRemaining = avcodec_decode_video(m_pVideoCodecCtx, m_pFrame,
&fDecodedFrame, m_sPacket.data, m_sPacket.size);
if(bytesRemaining < 0)
{
TRACE(DbgPlugins, "Error decoding frame %d\n",
m_pFrame->display_picture_number);
}
if(fDecodedFrame)
{
TRACE(DbgPlugins, "Decoded frame %d\n",
m_pFrame->display_picture_number);
/* Enqueue frame */
/* Copy data and specs from m_pFrame into our CFrame */
ColorModel eCM = ConvertPixFmt(m_pVideoCodecCtx->pix_fmt);
CFrame *pFrame = new CFrame(m_pFrame->display_picture_number);
if(1 || eCM == CM_UNKNOWN)
{
/* Convert image to RGB24 for testing (I know it says YV12) */
m_pFrameYV12 = avcodec_alloc_frame();
avpicture_fill((AVPicture *)m_pFrameYV12,
m_pYV12Buffer, PIX_FMT_RGB24,
m_pVideoCodecCtx->width, m_pVideoCodecCtx->height);
img_convert((AVPicture *)m_pFrameYV12, PIX_FMT_RGB24,
(AVPicture *)m_pFrame, m_pVideoCodecCtx->pix_fmt,
m_pVideoCodecCtx->width,
m_pVideoCodecCtx->height);
eCM = CM_YV12;
}
else
{
m_pFrameYV12 = m_pFrame;
}
pFrame->CopyToBuffer(m_pFrameYV12->data[0],
m_ulYV12BufferSize);
pFrame->SetDimensions(m_pVideoCodecCtx->width,
m_pVideoCodecCtx->height);
pFrame->SetColorModel(eCM);
pFrame->SetPitch(m_pFrameYV12->linesize[0]);
if(m_pFrameYV12 != m_pFrame)
free(m_pFrameYV12);
m_pFrameYV12 = NULL;
//if(m_pFrameQueue->Count() > FRAMES_TO_BUFFER)
// delete m_pFrameQueue->Dequeue();
m_pFrameQueue->Append(pFrame);
// Break out of the loop
av_free_packet(&m_sPacket);
break;
}
}
else
{
#if 0
m_ulRawSampleSize = AVCODEC_MAX_AUDIO_FRAME_SIZE;
S32 lBytesDecoded = avcodec_decode_audio2(m_pAudioCodecCtx,
(int16_t*)m_pRawSamples,
(int *)&m_ulRawSampleSize, m_sPacket.data, m_sPacket.size);
if(lBytesDecoded > 0)
{
/* Enqueue samples into buffer */
CSample *pSample = new CSample();
pSample->CopyToBuffer(m_pRawSamples, m_ulRawSampleSize);
if(m_pSampleQueue->Count() > SAMPLES_TO_QUEUE)
delete m_pSampleQueue->Dequeue();
m_pSampleQueue->Append(pSample);
}
else if(lBytesDecoded < 0)
TRACE(DbgPlugins, "FileReader: error decoding audio\n");
#endif
}
av_free_packet(&m_sPacket);
}
return 0;
}