All pastes #471713 Raw Edit

Stuff

public text v1 · immutable
·published 2007-05-05 02:32 UTC
rendered paste body
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;
}