⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xyuv.c.svn-base

📁 这是h.264的测试模型
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
                                    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 + -