📄 xyuv.c
字号:
SDL_ASYNCBLIT|SDL_HWACCEL ); if( xyuv.screen == NULL ) { fprintf( stderr, "SDL_SetVideoMode failed\n" ); return -1; } SDL_LockSurface( xyuv.screen ); xyuv.overlay = SDL_CreateYUVOverlay( xyuv.i_sdl_width, xyuv.i_sdl_height, SDL_YV12_OVERLAY, xyuv.screen ); /* reset with black */ memset( xyuv.overlay->pixels[0], 0, xyuv.overlay->pitches[0] * xyuv.i_sdl_height ); memset( xyuv.overlay->pixels[1], 128, xyuv.overlay->pitches[1] * xyuv.i_sdl_height / 2); memset( xyuv.overlay->pixels[2], 128, xyuv.overlay->pitches[2] * xyuv.i_sdl_height / 2); SDL_UnlockSurface( xyuv.screen ); if( xyuv.overlay == NULL ) { fprintf( stderr, "recon: SDL_CreateYUVOverlay failed\n" ); return -1; } for( ;; ) { SDL_Event event; int64_t i_start = SDL_GetTicks(); int i_wait; if( !xyuv.b_pause ) { xyuv_display( &xyuv, xyuv.i_frame ); } for( ;; ) { int b_refresh = 0; while( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_QUIT: exit( 1 ); case SDL_KEYDOWN: switch( event.key.keysym.sym ) { case SDLK_q: case SDLK_ESCAPE: exit(1); case SDLK_f: SDL_WM_ToggleFullScreen( xyuv.screen ); break; case SDLK_g: if( xyuv.b_grid ) xyuv.b_grid = 0; else xyuv.b_grid = 1; if( xyuv.b_pause ) b_refresh = 1; break; case SDLK_SPACE: if( xyuv.b_pause ) xyuv.b_pause = 0; else xyuv.b_pause = 1; break; case SDLK_LEFT: if( xyuv.i_frame > 1 ) xyuv.i_frame--; b_refresh = 1; break; case SDLK_RIGHT: if( xyuv.i_frame < xyuv.i_frames ) xyuv.i_frame++; b_refresh = 1; break; case SDLK_HOME: xyuv.i_frame = 1; if( xyuv.b_pause ) b_refresh = 1; break; case SDLK_END: xyuv.i_frame = xyuv.i_frames; b_refresh = 1; break; case SDLK_UP: xyuv.i_frame += xyuv.i_frames / 20; if( xyuv.i_frame > xyuv.i_frames ) xyuv.i_frame = xyuv.i_frames; b_refresh = 1; break; case SDLK_DOWN: xyuv.i_frame -= xyuv.i_frames / 20; if( xyuv.i_frame < 1 ) xyuv.i_frame = 1; b_refresh = 1; break; case SDLK_PAGEUP: xyuv.i_frame += xyuv.i_frames / 10; if( xyuv.i_frame > xyuv.i_frames ) xyuv.i_frame = xyuv.i_frames; b_refresh = 1; break; case SDLK_PAGEDOWN: xyuv.i_frame -= xyuv.i_frames / 10; if( xyuv.i_frame < 1 ) xyuv.i_frame = 1; b_refresh = 1; break; default: break; } break; case SDL_VIDEORESIZE: xyuv.i_display_width = event.resize.w; xyuv.i_display_height = event.resize.h; xyuv.screen = SDL_SetVideoMode( xyuv.i_display_width, xyuv.i_display_height, 0, SDL_HWSURFACE|SDL_RESIZABLE| SDL_ASYNCBLIT|SDL_HWACCEL ); xyuv_display( &xyuv, xyuv.i_frame ); break; default: break; } } if( b_refresh ) { xyuv.b_pause = 1; xyuv_display( &xyuv, xyuv.i_frame ); } /* wait */ i_wait = 1000 / xyuv.f_fps - ( SDL_GetTicks() - i_start); if( i_wait < 0 ) break; else if( i_wait > 200 ) SDL_Delay( 200 ); else { SDL_Delay( i_wait ); break; } } if( !xyuv.b_pause ) { /* next frame */ if( xyuv.i_frame == xyuv.i_frames ) xyuv.b_pause = 1; else if( xyuv.i_frame < xyuv.i_frames ) xyuv.i_frame++; } } return 0;err_missing_arg: fprintf( stderr, "missing arg for option=%s\n", argv[i] ); return -1;}static void xyuv_display( xyuv_t *xyuv, int i_frame ){ SDL_Rect rect; int i_picture = 0; int i; if( i_frame > xyuv->i_frames ) return; xyuv->i_frame = i_frame; /* Load and copy pictue data */ for( i = 0; i < xyuv->i_yuv; i++ ) { int i_plane; if( i_frame - 1 >= xyuv->yuv[i].i_frames ) continue; i_picture++; fseek( xyuv->yuv[i].f, (xyuv->i_frame-1) * xyuv->i_frame_size, SEEK_SET ); fread( xyuv->pic, xyuv->i_frame_size, 1, xyuv->yuv[i].f ); SDL_LockYUVOverlay( xyuv->overlay ); if( xyuv->b_diff || xyuv->b_split ) { /* Reset UV */ for( i_plane = 1; i_plane < 3; i_plane++ ) { memset( xyuv->overlay->pixels[i_plane], 128, xyuv->overlay->pitches[i_plane] * xyuv->overlay->h / 2 ); } /* Show diff in Y plane of overlay */ for( i_plane = 0; i_plane < 3; i_plane++ ) { int div = i_plane == 0 ? 1 : 2; uint8_t *src = xyuv->pic; uint8_t *dst = xyuv->overlay->pixels[0] + (xyuv->yuv[i].x + xyuv->yuv[i].y * xyuv->overlay->pitches[0] ); int j; if( i_plane == 1 ) { src += 5*xyuv->i_width * xyuv->i_height/4; dst += xyuv->i_width; } else if( i_plane == 2 ) { src += xyuv->i_width * xyuv->i_height; dst += xyuv->i_width + xyuv->i_height / 2 * xyuv->overlay->pitches[0]; } for( j = 0; j < xyuv->i_height / div; j++ ) { if( i_picture == 1 || xyuv->b_split ) { memcpy( dst, src, xyuv->i_width / div ); } else { int k; for( k = 0; k < xyuv->i_width / div; k++ ) { dst[k] = abs( dst[k] - src[k]); } } src += xyuv->i_width / div; dst += xyuv->overlay->pitches[0]; } } } else { for( i_plane = 0; i_plane < 3; i_plane++ ) { int div = i_plane == 0 ? 1 : 2; uint8_t *src = xyuv->pic; uint8_t *dst = xyuv->overlay->pixels[i_plane] + ((xyuv->yuv[i].x + xyuv->yuv[i].y * xyuv->overlay->pitches[i_plane] ) / div ); int w = xyuv->i_width / div; int j; if( i_plane == 1 ) { src += 5*xyuv->i_width * xyuv->i_height/4; } else if( i_plane == 2 ) { src += xyuv->i_width * xyuv->i_height; } if( xyuv->i_join > 0 ) { if( i_picture > 1 ) { src += xyuv->i_join / div; dst += xyuv->i_join / div; w = (xyuv->i_width - xyuv->i_join) /div; } else { w = xyuv->i_join / div; } } for( j = 0; j < xyuv->i_height / div; j++ ) { memcpy( dst, src, w ); src += xyuv->i_width / div; dst += xyuv->overlay->pitches[i_plane]; } } } SDL_UnlockYUVOverlay( xyuv->overlay ); } if( xyuv->f_y != 0.0 ) { uint8_t *pix = xyuv->overlay->pixels[0]; int j; for( j = 0; j < xyuv->i_sdl_height; j++ ) { int k; for( k = 0; k < xyuv->i_sdl_width; k++ ) { int v= pix[k] * xyuv->f_y; if( v > 255 ) pix[k] = 255; else if( v < 0 ) pix[k] = 0; else pix[k] = v; } pix += xyuv->overlay->pitches[0]; } } if( xyuv->b_grid ) { int x, y; for( y = 0; y < xyuv->i_sdl_height; y += 4 ) { uint8_t *p = xyuv->overlay->pixels[0] + y * xyuv->overlay->pitches[0]; for( x = 0; x < xyuv->i_sdl_width; x += 4 ) { if( x%16== 0 || y%16 == 0 ) p[x] = 0; } } } /* Update display */ rect.x = 0; rect.y = 0; rect.w = xyuv->i_display_width; rect.h = xyuv->i_display_height; SDL_DisplayYUVOverlay( xyuv->overlay, &rect ); /* Display title */ if( xyuv->title ) free( xyuv->title ); asprintf( &xyuv->title, SDL_TITLE, xyuv->yuv[0].name, xyuv->i_frame, xyuv->i_frames, xyuv->f_fps ); SDL_WM_SetCaption( xyuv->title, "" );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -