Ignore:
Timestamp:
Jun 6, 2011 11:11:35 AM (13 years ago)
Author:
ming
Message:

Fixed #1274: SDL video resize

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia-videodev/sdl_dev.c

    r3577 r3578  
    4343#define DEFAULT_FPS             25 
    4444 
     45#if !(SDL_VERSION_ATLEAST(1,3,0)) 
     46#   define SDL_PIXELFORMAT_RGBA8888 0 
     47#   define SDL_PIXELFORMAT_RGB24    0 
     48#   define SDL_PIXELFORMAT_BGRA8888 0 
     49#   define SDL_PIXELFORMAT_ABGR8888 0 
     50#   define SDL_PIXELFORMAT_BGR24    0 
     51#   define SDL_PIXELFORMAT_ARGB8888 0 
     52#   define SDL_PIXELFORMAT_RGB24    0 
     53#endif 
    4554 
    4655typedef struct sdl_fmt_info 
     
    5766{ 
    5867#if PJ_IS_BIG_ENDIAN 
    59     {PJMEDIA_FORMAT_RGBA,  SDL_PIXELFORMAT_RGBA8888, 
     68    {PJMEDIA_FORMAT_RGBA,  (Uint32)SDL_PIXELFORMAT_RGBA8888, 
    6069     0xFF000000, 0xFF0000, 0xFF00, 0xFF} , 
    61     {PJMEDIA_FORMAT_RGB24, SDL_PIXELFORMAT_RGB24, 
     70    {PJMEDIA_FORMAT_RGB24, (Uint32)SDL_PIXELFORMAT_RGB24, 
    6271     0xFF0000, 0xFF00, 0xFF, 0} , 
    63     {PJMEDIA_FORMAT_BGRA,  SDL_PIXELFORMAT_BGRA8888, 
     72    {PJMEDIA_FORMAT_BGRA,  (Uint32)SDL_PIXELFORMAT_BGRA8888, 
    6473     0xFF00, 0xFF0000, 0xFF000000, 0xFF} , 
    6574#else 
    66     {PJMEDIA_FORMAT_RGBA,  SDL_PIXELFORMAT_ABGR8888, 
     75    {PJMEDIA_FORMAT_RGBA,  (Uint32)SDL_PIXELFORMAT_ABGR8888, 
    6776     0xFF, 0xFF00, 0xFF0000, 0xFF000000} , 
    68     {PJMEDIA_FORMAT_RGB24, SDL_PIXELFORMAT_BGR24, 
     77    {PJMEDIA_FORMAT_RGB24, (Uint32)SDL_PIXELFORMAT_BGR24, 
    6978     0xFF, 0xFF00, 0xFF0000, 0} , 
    70     {PJMEDIA_FORMAT_BGRA,  SDL_PIXELFORMAT_ARGB8888, 
     79    {PJMEDIA_FORMAT_BGRA,  (Uint32)SDL_PIXELFORMAT_ARGB8888, 
    7180     0xFF0000, 0xFF00, 0xFF, 0xFF000000} , 
    7281#endif 
    7382 
    74     {PJMEDIA_FORMAT_DIB  , SDL_PIXELFORMAT_RGB24, 
     83    {PJMEDIA_FORMAT_DIB , (Uint32)SDL_PIXELFORMAT_RGB24, 
    7584     0xFF0000, 0xFF00, 0xFF, 0} , 
    7685 
     
    138147    pj_status_t                  status; 
    139148    pjmedia_format              *new_fmt; 
     149    pjmedia_rect_size           *new_disp_size; 
    140150 
    141151#if SDL_VERSION_ATLEAST(1,3,0) 
     
    145155    int                          pitch;             /**< Pitch value.       */ 
    146156#endif 
    147     SDL_Rect                     rect;              /**< Display rectangle. */ 
     157    SDL_Rect                     rect;              /**< Frame rectangle.   */ 
     158    SDL_Rect                     dstrect;           /**< Display rectangle. */ 
    148159    SDL_Surface                 *screen;            /**< Display screen.    */ 
    149160    SDL_Surface                 *surf;              /**< RGB surface.       */ 
     
    260271    unsigned i, j; 
    261272 
     273#if SDL_VERSION_ATLEAST(1,3,0) 
    262274#if defined(PJ_DARWINOS) && PJ_DARWINOS!=0 
    263275    sf->apool = [[NSAutoreleasePool alloc] init]; 
     
    267279#else 
    268280    /* Initialize the SDL library */ 
    269     if (SDL_Init(SDL_INIT_VIDEO)) { 
    270         PJ_LOG(4, (THIS_FILE, "Cannot initialize SDL")); 
     281    if (SDL_Init(SDL_INIT_VIDEO)) 
    271282        return PJMEDIA_EVID_INIT; 
    272     } 
     283#endif 
    273284#endif 
    274285 
     
    332343    pj_pool_release(pool); 
    333344 
     345#if SDL_VERSION_ATLEAST(1,3,0) 
    334346#if defined(PJ_DARWINOS) && PJ_DARWINOS!=0 
    335347    [sf->delegate performSelectorOnMainThread:@selector(sdl_quit)  
     
    339351#else 
    340352    SDL_Quit(); 
     353#endif 
    341354#endif 
    342355 
     
    420433static void destroy_sdl(struct sdl_stream *strm, pj_bool_t destroy_win) 
    421434{ 
     435    PJ_UNUSED_ARG(destroy_win); 
     436 
    422437    if (strm->surf) { 
    423438        SDL_FreeSurface(strm->surf); 
     
    482497    strm->rect.w = (Uint16)vfd->size.w; 
    483498    strm->rect.h = (Uint16)vfd->size.h; 
     499    if (strm->param.disp_size.w == 0) 
     500        strm->param.disp_size.w = strm->rect.w; 
     501    if (strm->param.disp_size.h == 0) 
     502        strm->param.disp_size.h = strm->rect.h; 
     503    strm->dstrect.x = strm->dstrect.y = 0; 
     504    strm->dstrect.w = (Uint16)strm->param.disp_size.w; 
     505    strm->dstrect.h = (Uint16)strm->param.disp_size.h; 
    484506 
    485507    destroy_sdl(strm, PJ_FALSE); 
     
    500522                                            SDL_WINDOWPOS_CENTERED, 
    501523                                            SDL_WINDOWPOS_CENTERED, 
    502                                             strm->rect.w, strm->rect.h, 
     524                                            strm->param.disp_size.w, 
     525                                            strm->param.disp_size.h, 
    503526                                            flags); 
    504527        } 
     
    507530    } 
    508531 
    509     SDL_SetWindowSize(strm->window, strm->rect.w, strm->rect.h); 
     532    SDL_SetWindowSize(strm->window, strm->param.disp_size.w, 
     533                      strm->param.disp_size.h); 
    510534 
    511535    /** 
     
    529553 
    530554#else 
    531  
    532555    /* Initialize the display */ 
    533     strm->screen = SDL_SetVideoMode(strm->rect.w, strm->rect.h, 0, ( 
     556    strm->screen = SDL_SetVideoMode(strm->param.disp_size.w,  
     557                                    strm->param.disp_size.h, 0, ( 
    534558#if PJMEDIA_VIDEO_DEV_SDL_HAS_OPENGL 
    535559                                    strm->param.rend_id == OPENGL_DEV_IDX? 
     
    552576         
    553577        /* Init the viewport */ 
    554         glViewport(0, 0, strm->rect.w, strm->rect.h); 
     578        glViewport(0, 0, strm->param.disp_size.w, strm->param.disp_size.h); 
    555579        glMatrixMode(GL_PROJECTION); 
    556580        glLoadIdentity(); 
    557581         
    558         glOrtho(0.0, (GLdouble)strm->rect.w, (GLdouble)strm->rect.h, 
    559                 0.0, 0.0, 1.0); 
     582        glOrtho(0.0, (GLdouble)strm->param.disp_size.w, 
     583                (GLdouble)strm->param.disp_size.h, 0.0, 0.0, 1.0); 
    560584         
    561585        glMatrixMode(GL_MODELVIEW); 
     
    617641static void detect_fmt_change(struct sdl_stream *strm) 
    618642{ 
    619     if (strm->new_fmt) { 
     643    if (strm->new_fmt || strm->new_disp_size) { 
    620644        /* Stop the stream */ 
    621645        sdl_stream_stop((pjmedia_vid_dev_stream *)strm); 
    622          
     646 
     647        if (strm->new_disp_size) 
     648            pj_memcpy(&strm->param.disp_size, strm->new_disp_size, 
     649                      sizeof(strm->param.disp_size)); 
     650 
    623651        /* Re-initialize SDL */ 
    624         strm->status = init_sdl(strm, strm->new_fmt); 
     652        strm->status = init_sdl(strm, (strm->new_fmt? strm->new_fmt : 
     653                                &strm->param.fmt)); 
    625654         
    626655        if (strm->status == PJ_SUCCESS) { 
    627             pjmedia_format_copy(&strm->param.fmt, strm->new_fmt); 
     656            if (strm->new_fmt) 
     657                pjmedia_format_copy(&strm->param.fmt, strm->new_fmt); 
    628658            /* Restart the stream */ 
    629659            sdl_stream_start((pjmedia_vid_dev_stream *)strm); 
    630660        } 
    631661        strm->new_fmt = NULL; 
     662        strm->new_disp_size = NULL; 
    632663    } 
    633664} 
     
    658689{ 
    659690    struct sdl_stream *strm = (struct sdl_stream*)data; 
     691#endif 
     692 
     693#if !(SDL_VERSION_ATLEAST(1,3,0)) 
     694    if (SDL_Init(SDL_INIT_VIDEO)) { 
     695        strm->status = PJMEDIA_EVID_INIT; 
     696        goto on_return; 
     697    } 
    660698#endif 
    661699 
     
    674712    if (strm->status != PJ_SUCCESS) { 
    675713        destroy_sdl(strm, PJ_TRUE); 
     714#if !(SDL_VERSION_ATLEAST(1,3,0)) 
     715        SDL_Quit(); 
     716#endif 
    676717        strm->screen = NULL; 
    677718    } 
     
    721762                case SDL_MOUSEBUTTONDOWN: 
    722763                    pevent.event_type = PJMEDIA_EVENT_MOUSEBUTTONDOWN; 
     764                    break; 
     765#if SDL_VERSION_ATLEAST(1,3,0) 
     766                case SDL_WINDOWEVENT: 
     767                    switch (sevent.window.event) { 
     768                        case SDL_WINDOWEVENT_RESIZED: 
     769                            pevent.event_type = PJMEDIA_EVENT_WINDOW_RESIZE; 
     770                            pevent.event_desc.resize.new_size.w = 
     771                                sevent.window.data1; 
     772                            pevent.event_desc.resize.new_size.h = 
     773                                sevent.window.data2; 
     774                            break; 
     775                    } 
     776                    break; 
     777#else 
     778                case SDL_VIDEORESIZE: 
     779                    pevent.event_type = PJMEDIA_EVENT_WINDOW_RESIZE; 
     780                    pevent.event_desc.resize.new_size.w = sevent.resize.w; 
     781                    pevent.event_desc.resize.new_size.h = sevent.resize.h; 
     782                    break; 
     783                case SDL_QUIT: 
     784                    pevent.event_type = PJMEDIA_EVENT_WINDOW_CLOSE; 
     785#endif 
     786            } 
     787 
     788            switch (pevent.event_type) { 
     789                case PJMEDIA_EVENT_MOUSEBUTTONDOWN: 
    723790                    if (strm->vid_cb.on_event_cb) 
    724791                        if ((*strm->vid_cb.on_event_cb)(&strm->base, 
     
    729796                            break; 
    730797                        } 
    731                     if (strm->is_running) 
    732                         pjmedia_vid_dev_stream_stop(&strm->base); 
    733                     else 
    734                         pjmedia_vid_dev_stream_start(&strm->base); 
    735798                    break; 
    736799 
    737                 case SDL_VIDEORESIZE: 
    738                     pevent.event_type = PJMEDIA_EVENT_WINDOW_RESIZE; 
    739                     pevent.event_desc.resize.new_size.w = sevent.resize.w; 
    740                     pevent.event_desc.resize.new_size.h = sevent.resize.h; 
     800                case PJMEDIA_EVENT_WINDOW_RESIZE: 
    741801                    if (strm->vid_cb.on_event_cb) { 
    742                         /**  
    743                          * To process PJMEDIA_EVENT_WINDOW_RESIZE event, 
    744                          * application should do this in the on_event_cb 
    745                          * callback: 
    746                          * 1. change the input frame size given to SDL 
    747                          *    to the new size. 
    748                          * 2. call pjmedia_vid_dev_stream_set_cap() 
    749                          *    using PJMEDIA_VID_DEV_CAP_FORMAT capability 
    750                          *    and the new format size 
    751                          */ 
    752                         (*strm->vid_cb.on_event_cb)(&strm->base, 
    753                                                     strm->user_data, 
    754                                                     &pevent); 
     802                        if ((*strm->vid_cb.on_event_cb)(&strm->base, 
     803                                                        strm->user_data, 
     804                                                        &pevent) != PJ_SUCCESS) 
     805                        { 
     806                            break; 
     807                        } 
    755808                    } 
     809                    strm->new_disp_size = &pevent.event_desc.resize.new_size; 
     810                    detect_fmt_change(strm); 
    756811                    break; 
    757812 
    758                 case SDL_QUIT: 
    759                     pevent.event_type = PJMEDIA_EVENT_WINDOW_CLOSE; 
     813                case PJMEDIA_EVENT_WINDOW_CLOSE: 
    760814                    /** 
    761815                     * To process PJMEDIA_EVENT_WINDOW_CLOSE event, 
     
    806860on_return: 
    807861    destroy_sdl(strm, PJ_TRUE); 
     862#if !(SDL_VERSION_ATLEAST(1,3,0)) 
     863    SDL_Quit(); 
     864#endif 
    808865    strm->screen = NULL; 
    809866 
     
    823880        glBegin(GL_TRIANGLE_STRIP); 
    824881        glTexCoord2f(0, 0); glVertex2i(0, 0); 
    825         glTexCoord2f(1, 0); glVertex2i(stream->rect.w, 0); 
    826         glTexCoord2f(0, 1); glVertex2i(0, stream->rect.h); 
    827         glTexCoord2f(1, 1); glVertex2i(stream->rect.w, stream->rect.h); 
     882        glTexCoord2f(1, 0); glVertex2i(stream->param.disp_size.w, 0); 
     883        glTexCoord2f(0, 1); glVertex2i(0, stream->param.disp_size.h); 
     884        glTexCoord2f(1, 1); 
     885        glVertex2i(stream->param.disp_size.w, stream->param.disp_size.h); 
    828886        glEnd(); 
    829887#if SDL_VERSION_ATLEAST(1,3,0) 
     
    873931            SDL_UnlockSurface(stream->surf); 
    874932        } 
    875         SDL_BlitSurface(stream->surf, NULL, stream->screen, NULL); 
     933        SDL_BlitSurface(stream->surf, NULL, stream->screen, &stream->dstrect); 
    876934#if SDL_VERSION_ATLEAST(1,3,0) 
    877935        SDL_UpdateWindowSurface(stream->window); 
     
    896954         
    897955        SDL_UnlockYUVOverlay(stream->overlay); 
    898         SDL_DisplayYUVOverlay(stream->overlay, &stream->rect); 
     956        SDL_DisplayYUVOverlay(stream->overlay, &stream->dstrect); 
    899957    } 
    900958#if SDL_VERSION_ATLEAST(1,3,0) 
     
    11081166            strm->new_fmt = &strm->param.fmt; 
    11091167#if defined(PJ_DARWINOS) && PJ_DARWINOS!=0 
    1110             [strm->delegate performSelectorOnMainThread:@selector(detect_new_fmt) 
     1168            [strm->delegate performSelectorOnMainThread: 
     1169                            @selector(detect_new_fmt) 
    11111170                            withObject:nil waitUntilDone:YES]; 
    11121171#endif 
     
    11261185         
    11271186        return strm->status; 
     1187    } else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE) { 
     1188        strm->new_disp_size = (pjmedia_rect_size *)pval; 
     1189#if defined(PJ_DARWINOS) && PJ_DARWINOS!=0 
     1190        [strm->delegate performSelectorOnMainThread: 
     1191                        @selector(detect_new_fmt) 
     1192                        withObject:nil waitUntilDone:YES]; 
     1193#endif 
     1194        while (strm->new_disp_size) 
     1195            pj_thread_sleep(10); 
     1196         
     1197        return strm->status; 
    11281198    } 
    11291199 
Note: See TracChangeset for help on using the changeset viewer.