//---------------------------------------- uint8_t renderUpdateImage(uint8_t *ptr) { ADM_assert(screenBuffer); if(zoom!=ZOOM_1_1) { ADM_assert(resizer); ADM_assert(resized); resizer->resize(ptr,resized->data); lastImage=resized->data; ptr=lastImage; } else { lastImage=ptr; } if(!accel_mode) GUI_ConvertRGB(ptr,screenBuffer, renderW,renderH); renderRefresh(); return 1; }
/** \fn renderExpose */ uint8_t renderExpose(void) { if(enableDraw==false) return true; renderRefresh(); return 1; }
//static uint8_t Vbuffer[7.0*5.6*3]; //AVDMGenericVideoStream *getFirstVideoFilter( void) // //_____________________________________________________________ void GUI_PlayAvi(void) { uint32_t time_e, time_a = 0; uint32_t err = 0, acc = 0; uint32_t max; uint32_t framelen,flags; AVDMGenericVideoStream *filter; ADMImage *buffer=NULL; vids = 0, auds = 0, dauds = 0; // check we got everything... if (!avifileinfo) return; if((curframe+1)>= avifileinfo->nb_frames-1) { printf("No frame left\n"); return; } if (avifileinfo->fps1000 == 0) return; if (playing) { stop_req = 1; return; } uint32_t played_frame=0; uint32_t remaining=avifileinfo->nb_frames-curframe; if(guiOutputDisplay) { filter=getLastVideoFilter(curframe,remaining); if(mode_preview) { editorKillPreview (); UI_setPreviewToggleStatus( 0 ); mode_preview=0; } } else { filter=getFirstVideoFilter(curframe,remaining ); } max=filter->getInfo()->nb_frames; // compute how much a frame lasts in ms one_frame = (uint32_t) floor(1000.*1000.*10. / filter->getInfo()->fps1000); err = one_frame % 10; one_frame /= 10; // Duration of a frame in ms, err =leftover in 1/10 ms buffer=new ADMImage(filter->getInfo()->width,filter->getInfo()->height); // go to RealTime... printf(" One frame : %lu, err=%lu ms\n", one_frame, err); // read frame in chunk if(!filter->getFrameNumberNoAlloc(1,&framelen,buffer,&flags)) { printf("\n cannot read frame!\n"); goto abort_play; } curframe++; played_frame++; // prepare 1st frame stop_req = 0; playing = 1; #ifdef HAVE_AUDIO ComputePreload(); #endif renderResize(filter->getInfo()->width,filter->getInfo()->height,currentZoom); renderStartPlaying(); // reset timer reference resetTime(); do { vids++; renderUpdateImage(buffer->data); if(mode_preview&&!guiOutputDisplay) { editorUpdatePreview(played_frame); } update_status_bar(buffer); if (time_a == 0) time_a = getTime(0); // mark ! //printf("\n Rendering %lu frame\n",curframe); // read frame in chunk if((played_frame)>=(max-1)) { printf("\n End met (%lu / %lu )\n",played_frame,max); goto abort_play; } if(!filter->getFrameNumberNoAlloc(played_frame+1,&framelen,buffer,&flags)) { printf("\n cannot read frame!\n"); goto abort_play; } curframe++; played_frame++; #ifdef HAVE_AUDIO FillAudio(); #endif time_e = getTime(1); acc += err; if (acc > 10) { acc -= 10; time_a++; } time_a += one_frame; // delta a is next frame time // time is is current time delta = time_a - time_e; if (delta <= 0) { //if(delta<-19) // allow 19 ms late without warning... // tick seems to be ~ 18 ms //printf("\n Late ....,due : %lu ms / found : %lu \n", // time_a,time_e); // a call to whatever sleep function will last at leat 10 ms // give some time to GTK } else { // a call to whatever sleep function will last at leat 10 ms // give some time to GTK if (delta > 10) GUI_Sleep(delta - 10); } // UI_purge(); if(mode_preview) { UI_purge(); UI_purge(); } } while (!stop_req); abort_play: // ___________________________________ // Flush buffer // go back to normal display mode //____________________________________ playing = 0; delete buffer; renderStopPlaying(); renderResize(avifileinfo->width , avifileinfo->height,currentZoom); getFirstVideoFilter( ); //video_body->getUncompressedFrame(curframe, rdr_decomp_buffer,&flags); GUI_getFrame(curframe, rdr_decomp_buffer, &flags); renderUpdateImage(rdr_decomp_buffer->data); renderRefresh(); update_status_bar(rdr_decomp_buffer); if(mode_preview) { editorUpdatePreview(curframe); } #ifdef HAVE_AUDIO if (currentaudiostream) { if (wavbuf) ADM_dealloc(wavbuf); deleteAudioFilter(NULL); currentaudiostream->endDecompress(); AVDM_AudioClose(); } #endif // done. };