1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-24 07:42:17 +00:00

notice vo driver about skipped/dropped frames

patch by Alvaro Lopes <alvieboy@alvie.com>


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8451 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi 2002-12-14 17:12:40 +00:00
parent 3eb3af54f3
commit bbeb54d80a
3 changed files with 67 additions and 4 deletions

View File

@ -49,7 +49,10 @@
/* equalizer controls */ /* equalizer controls */
#define VOCTRL_SET_EQUALIZER 17 #define VOCTRL_SET_EQUALIZER 17
#define VOCTRL_GET_EQUALIZER 18 #define VOCTRL_GET_EQUALIZER 18
// ... 20 //#define VOCTRL_GUI_NOWINDOW 19
/* Frame duplication */
#define VOCTRL_DUPLICATE_FRAME 20
// ... 21
#define VO_TRUE 1 #define VO_TRUE 1

View File

@ -222,6 +222,56 @@ static void vo_y4m_write(const void *ptr, const size_t num_bytes)
perror("yuv4mpeg: Error writing image to output!"); perror("yuv4mpeg: Error writing image to output!");
} }
static int write_last_frame(void)
{
uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower;
int rgb_stride, uv_stride, field_height;
unsigned int i, low_ofs;
fprintf(yuv_out, "FRAME\n");
if (using_format != IMGFMT_YV12)
{
rgb_stride = image_width * 3;
uv_stride = image_width / 2;
if (Y4M_IS_INTERLACED)
{
field_height = image_height / 2;
upper_y = image;
upper_u = upper_y + image_width * field_height;
upper_v = upper_u + image_width * field_height / 4;
low_ofs = image_width * field_height * 3 / 2;
rgb_buffer_lower = rgb_buffer + rgb_stride * field_height;
/* Write Y plane */
for(i = 0; i < field_height; i++)
{
vo_y4m_write(upper_y + image_width * i, image_width);
vo_y4m_write(upper_y + image_width * i + low_ofs, image_width);
}
/* Write U and V plane */
for(i = 0; i < field_height / 2; i++)
{
vo_y4m_write(upper_u + uv_stride * i, uv_stride);
vo_y4m_write(upper_u + uv_stride * i + low_ofs, uv_stride);
}
for(i = 0; i < field_height / 2; i++)
{
vo_y4m_write(upper_v + uv_stride * i, uv_stride);
vo_y4m_write(upper_v + uv_stride * i + low_ofs, uv_stride);
}
return VO_TRUE; /* Image written; We have to stop here */
}
}
/* Write progressive frame */
vo_y4m_write(image, write_bytes);
return VO_TRUE;
}
static void flip_page (void) static void flip_page (void)
{ {
uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower; uint8_t *upper_y, *upper_u, *upper_v, *rgb_buffer_lower;
@ -455,6 +505,8 @@ static uint32_t control(uint32_t request, void *data, ...)
switch (request) { switch (request) {
case VOCTRL_QUERY_FORMAT: case VOCTRL_QUERY_FORMAT:
return query_format(*((uint32_t*)data)); return query_format(*((uint32_t*)data));
case VOCTRL_DUPLICATE_FRAME:
return write_last_frame();
} }
return VO_NOTIMPL; return VO_NOTIMPL;
} }

View File

@ -1725,7 +1725,8 @@ if(time_frame>0.001 && !(vo_flags&256)){
if(vo_config_count) video_out->check_events(); if(vo_config_count) video_out->check_events();
current_module="flip_page"; current_module="flip_page";
if(blit_frame && !frame_time_remaining){ if (!frame_time_remaining) {
if(blit_frame){
unsigned int t2=GetTimer(); unsigned int t2=GetTimer();
double tt; double tt;
float j; float j;
@ -1744,8 +1745,15 @@ if(time_frame>0.001 && !(vo_flags&256)){
t2=GetTimer()-t2; t2=GetTimer()-t2;
tt = t2*0.000001f; tt = t2*0.000001f;
vout_time_usage+=tt; vout_time_usage+=tt;
} } else {
/*
Well, no blitting is needed, but some devices (such as yuv4mpeg) must output frame
otherwise A/V desync will occur. -- Alvieboy
*/
if (vo_config_count)
video_out->control(VOCTRL_DUPLICATE_FRAME, NULL);
}
}
//====================== A-V TIMESTAMP CORRECTION: ========================= //====================== A-V TIMESTAMP CORRECTION: =========================
current_module="av_sync"; current_module="av_sync";