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