dec_frame_ff_decoding=NULL;
ogl_frame_outside=false;
#endif
-
+
#ifdef BENCHMARK_FPS
time_in_decoder=0;
num_frames=0;
Log::getInstance()->log("Video", Log::DEBUG, "Opening ffmpeg codec failed");
return 0;
}
- Log::getInstance()->log("Video", Log::NOTICE, "AllocateCodecsFFmpeg mark1");
+ memset(&incom_packet_ff,0,sizeof(incom_packet_ff));
+ incom_packet_ff_size=200000;
+ incom_packet_ff.data=(uint8_t*)av_malloc(incom_packet_ff_size+FF_INPUT_BUFFER_PADDING_SIZE);
+
dec_frame_ff_mutex.Lock();
- Log::getInstance()->log("Video", Log::NOTICE, "AllocateCodecsFFmpeg mark2");
for (int i=0;i<3;i++) {
AVFrame *dec_frame_ff=avcodec_alloc_frame(); // may be we need multiple frames, if we want to use async texture upload
if (!dec_frame_ff) {
dec_frame_ff_free.push_back(dec_frame_ff);
}
dec_frame_ff_decoding=NULL;
- Log::getInstance()->log("Video", Log::NOTICE, "AllocateCodecsFFmpeg mark 3");
dec_frame_ff_mutex.Unlock();
ogl_frame_mutex.Lock();
}
dec_frame_ff_all.clear();
+
+ av_free(incom_packet_ff.data);
+ incom_packet_ff.data=NULL;
+ incom_packet_ff_size=0;
+
dec_frame_ff_mutex.Unlock();
dec_frame_ff_decoding=NULL;
while (ogl_frame_outside) {
#endif
-
+
// if (ioctl(fdVideo, AV_SET_VID_STOP, 0) != 0) return 0;
return 1;
int VideoVPEOGL::reset()
{
if (!initted) return 0;
-
+
// if (ioctl(fdVideo, AV_SET_VID_RESET, 0x11) != 0) return 0;
return 1;
}
#ifdef VPE_FFMPEG_SUPPORT
+int VideoVPEOGL::DecodePacketFFMPEG()
+{
+ unsigned int haveToCopy=incom_packet_ff.size;
+ if (incom_packet_ff.size==0) return 1; // we are already empty
+ while (haveToCopy>0) {
+ int dec_bytes=0;
+ int frame_ready=0;
+
+ // Log::getInstance()->log("Video", Log::DEBUG, "Push data to decoder");
+
+#ifdef BENCHMARK_FPS
+ int cur_time=getTimeMS();
+#endif
+
+ dec_bytes=avcodec_decode_video2(mpeg2codec_context_ff, dec_frame_ff_decoding,
+ &frame_ready, &incom_packet_ff);
+#ifdef BENCHMARK_FPS
+ time_in_decoder+=getTimeMS()-cur_time;
+ if (frame_ready) num_frames++;
+ if ((num_frames%100)==0) {
+ float fps=1000./(float)(time_in_decoder);
+ fps*=((float)num_frames);
+ Log::getInstance()->log("Video", Log::NOTICE, "Current Pure Decoding FPS %g", fps);
+ }
+#endif
+ if (dec_bytes<0) {
+ Log::getInstance()->log("Video", Log::DEBUG, "Decoding frame failed %x", dec_bytes);
+ return 0;
+ }
+ haveToCopy-=dec_bytes;
+ if (frame_ready) {
+ // Log::getInstance()->log("Video", Log::DEBUG, "We have a frame push it to osd");
+
+ dec_frame_ff_mutex.Lock();
+ ffwidth=mpeg2codec_context_ff->width;
+ ffheight=mpeg2codec_context_ff->height;
+ ffpixfmt=mpeg2codec_context_ff->pix_fmt;
+ // Log::getInstance()->log("Video", Log::DEBUG, "Frame info %d %d %d",ffwidth,ffheight,ffpixfmt);
+
+ dec_frame_ff_upload_pending.push_back(dec_frame_ff_decoding);
+ dec_frame_ff_decoding=NULL;
+ if (dec_frame_ff_free.size()>0) {
+ dec_frame_ff_decoding=dec_frame_ff_free.front();
+ dec_frame_ff_free.pop_front();
+ dec_frame_ff_mutex.Unlock();
+ threadSignal();
+ ffmpeg_hastime=false;
+ } else {
+ ffmpeg_hastime=false;
+ dec_frame_ff_mutex.Unlock();
+ // No free Buffers
+ return 0;
+ }
+
+
+ }
+
+ }
+ incom_packet_ff.size=0;
+ return 1;
+
+}
+
+
UINT VideoVPEOGL::DeliverMediaPacketFFMPEG(MediaPacket packet,
const UCHAR* buffer,
UINT *samplepos)
}
UINT headerstrip=0;
-/* if (packet.disconti) {
+ if (packet.disconti) {
firstsynched=false;
- if (cur_input_buf_omx) {
- OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
- }
- cur_input_buf_omx=NULL;
- }
- }*/
+ if (!DecodePacketFFMPEG()) return 0;
+ }
/*Inspect PES-Header */
if (!dec_frame_ff_decoding) {
*samplepos+=headerstrip;
if ( packet.synched ) {
- /*if (cur_input_buf_omx) {
- OMX_ERRORTYPE error=OMX_EmptyThisBuffer(omx_vid_dec,cur_input_buf_omx);
- if (error!=OMX_ErrorNone){
- Log::getInstance()->log("Video", Log::DEBUG, "OMX_EmptyThisBuffer failed %x", error);
- }
+ if (!DecodePacketFFMPEG()) return 0; // WriteOut old Data
- cur_input_buf_omx=NULL;//write out old data
- }*/
ffmpeg_time=packet.presentation_time;
ffmpeg_hastime=true;
// reftime1=packet.presentation_time;
}*/
unsigned int haveToCopy=packet.length-*samplepos;
- while (haveToCopy>0) {
- int dec_bytes=0;
- int frame_ready=0;
-
- // Log::getInstance()->log("Video", Log::DEBUG, "Push data to decoder");
-
-#ifdef BENCHMARK_FPS
- int cur_time=getTimeMS();
-#endif
-
- dec_bytes=avcodec_decode_video(mpeg2codec_context_ff, dec_frame_ff_decoding,
- &frame_ready, buffer+packet.pos_buffer+*samplepos, haveToCopy);
-#ifdef BENCHMARK_FPS
- time_in_decoder+=getTimeMS()-cur_time;
- if (frame_ready) num_frames++;
- if ((num_frames%100)==0) {
- float fps=1000./(float)(time_in_decoder);
- fps*=((float)num_frames);
- Log::getInstance()->log("Video", Log::NOTICE, "Current Pure Decoding FPS %g", fps);
- }
-#endif
- if (dec_bytes<0) {
- Log::getInstance()->log("Video", Log::DEBUG, "Decoding frame failed %x", dec_bytes);
- return *samplepos;
- }
- *samplepos+=dec_bytes;
- haveToCopy-=dec_bytes;
- if (frame_ready) {
- // Log::getInstance()->log("Video", Log::DEBUG, "We have a frame push it to osd");
- dec_frame_ff_mutex.Lock();
- ffwidth=mpeg2codec_context_ff->width;
- ffheight=mpeg2codec_context_ff->height;
- ffpixfmt=mpeg2codec_context_ff->pix_fmt;
- // Log::getInstance()->log("Video", Log::DEBUG, "Frame info %d %d %d",ffwidth,ffheight,ffpixfmt);
-
- dec_frame_ff_upload_pending.push_back(dec_frame_ff_decoding);
- dec_frame_ff_decoding=NULL;
- if (dec_frame_ff_free.size()>0) {
- dec_frame_ff_decoding=dec_frame_ff_free.front();
- dec_frame_ff_free.pop_front();
- dec_frame_ff_mutex.Unlock();
- threadSignal();
- ffmpeg_hastime=false;
- } else {
- ffmpeg_hastime=false;
- dec_frame_ff_mutex.Unlock();
- // No free Buffers
- return *samplepos;
- }
+ if ((incom_packet_ff_size-incom_packet_ff.size)< haveToCopy) {
+ // if the buffer is to small reallocate
+ incom_packet_ff_size+=haveToCopy;
+ incom_packet_ff.data=(uint8_t*)av_realloc(incom_packet_ff.data,incom_packet_ff_size+FF_INPUT_BUFFER_PADDING_SIZE);
+ Log::getInstance()->log("Video", Log::DEBUG, "Reallocate avpacket buffer to %d", incom_packet_ff_size);
+ }
+ memcpy(incom_packet_ff.data,buffer+packet.pos_buffer+*samplepos,haveToCopy);
+ incom_packet_ff.size+=haveToCopy;
+ *samplepos+=haveToCopy;
- }
- }
return *samplepos;
//write(fdVideo, buffer, length);
if (!iframemode) EnterIframePlayback();
// WriteOutTS(buffer,length, h264?MPTYPE_VIDEO_H264 :MPTYPE_VIDEO_MPEG2 );
-
+
lastpacketnum=-1;
return true;
}