void VideoDecoder::DecodeThread()
{
    AVPacket pkt;
	int len;
	uint8_t *data;
	int size;
	uint32_t h,w;
	
	if(!_pkt_queue->Pop(&pkt))
		return;

	data = pkt.data;
	size = pkt.size;

	_pkt_pts = pkt.pts *_video_stream->time_base.num*1000/_video_stream->time_base.den;

	int got_frame;

	while (pkt.size > 0)
	{
		len = avcodec_decode_video2(_video_stream->codec,_av_frame,&got_frame,&pkt);
			if (len < 0)
			{
				LOG  "invalid video packet or frame. Skipping packet" EL;
				break;
			}

			if (got_frame!=0)
			{
				VideoFrame video_frame;

				h = _video_stream->codec->height;
				w = _video_stream->codec->width;

				video_frame.y = fast_alloc(uint8_t,h*w);
				video_frame.u = fast_alloc(uint8_t,h*w/4);
				video_frame.v = fast_alloc(uint8_t,h*w/4);

				WritePlane(_av_frame->data[0],_av_frame->linesize[0],w,h,video_frame.y);
				WritePlane(_av_frame->data[1],_av_frame->linesize[1],w/2,h/2,video_frame.u);
				WritePlane(_av_frame->data[2],_av_frame->linesize[2],w/2,h/2,video_frame.v);
                
                video_frame.pts = _pkt_pts;
                _pkt_pts += GetFramerateDelay();

				if (!_frame_queue->Push(video_frame))
				{
					fast_free(video_frame.y);
					fast_free(video_frame.u);
					fast_free(video_frame.v);
					av_free_packet(&pkt);
					return;
				}
			}

			pkt.size -= len;
			pkt.data += len;
		}

	pkt.data = data;
	pkt.size = size;

	av_free_packet(&pkt);
}