Ignore:
Timestamp:
Jul 12, 2011 3:05:35 AM (13 years ago)
Author:
bennylp
Message:

Initial implementation of re #1284 (Event Framework). Current event has been converted to the new framework. Next to convert is codec event

File:
1 edited

Legend:

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

    r3605 r3617  
    148148    pjmedia_format              *new_fmt; 
    149149    pjmedia_rect_size           *new_disp_size; 
     150    pj_timestamp                 last_ts; 
    150151 
    151152#if SDL_VERSION_ATLEAST(1,3,0) 
     
    684685{ 
    685686    struct sdl_stream *strm = (struct sdl_stream*)data; 
     687    pj_bool_t notify_wnd_closed_event = PJ_FALSE; 
     688    pj_status_t saved_stream_status; 
    686689#endif 
    687690 
     
    734737    { 
    735738        SDL_Event sevent; 
    736         pjmedia_vid_event pevent; 
     739        pjmedia_event pevent; 
    737740 
    738741#if PJMEDIA_VIDEO_DEV_SDL_HAS_OPENGL 
     
    752755         */ 
    753756        while (SDL_PollEvent(&sevent)) { 
    754             pj_bzero(&pevent, sizeof(pevent)); 
     757            pjmedia_event_init(&pevent, PJMEDIA_EVENT_NONE, &strm->last_ts, 
     758                               &strm->base.epub); 
    755759 
    756760            switch(sevent.type) { 
    757761                case SDL_MOUSEBUTTONDOWN: 
    758                     pevent.event_type = PJMEDIA_EVENT_MOUSEBUTTONDOWN; 
     762                    pevent.type = PJMEDIA_EVENT_MOUSE_BTN_DOWN; 
    759763                    break; 
    760764#if SDL_VERSION_ATLEAST(1,3,0) 
     
    762766                    switch (sevent.window.event) { 
    763767                        case SDL_WINDOWEVENT_RESIZED: 
    764                             pevent.event_type = PJMEDIA_EVENT_WINDOW_RESIZE; 
    765                             pevent.event_desc.resize.new_size.w = 
     768                            pevent.type = PJMEDIA_EVENT_WND_RESIZED; 
     769                            pevent.data.wnd_resized.new_size.w = 
    766770                                sevent.window.data1; 
    767                             pevent.event_desc.resize.new_size.h = 
     771                            pevent.data.wnd_resized.new_size.h = 
    768772                                sevent.window.data2; 
    769773                            break; 
     
    772776#else 
    773777                case SDL_VIDEORESIZE: 
    774                     pevent.event_type = PJMEDIA_EVENT_WINDOW_RESIZE; 
    775                     pevent.event_desc.resize.new_size.w = sevent.resize.w; 
    776                     pevent.event_desc.resize.new_size.h = sevent.resize.h; 
     778                    pevent.type = PJMEDIA_EVENT_WND_RESIZED; 
     779                    pevent.data.wnd_resized.new_size.w = sevent.resize.w; 
     780                    pevent.data.wnd_resized.new_size.h = sevent.resize.h; 
    777781                    break; 
    778782                case SDL_QUIT: 
    779                     pevent.event_type = PJMEDIA_EVENT_WINDOW_CLOSE; 
     783                    pevent.type = PJMEDIA_EVENT_WND_CLOSING; 
     784                    break; 
    780785#endif 
    781786            } 
    782787 
    783             switch (pevent.event_type) { 
    784                 case PJMEDIA_EVENT_MOUSEBUTTONDOWN: 
    785                     if (strm->vid_cb.on_event_cb) 
    786                         if ((*strm->vid_cb.on_event_cb)(&strm->base, 
    787                                                         strm->user_data, 
    788                                                         &pevent) != PJ_SUCCESS) 
    789                         { 
    790                             /* Application wants us to ignore this event */ 
    791                             break; 
    792                         } 
    793                     break; 
    794  
    795                 case PJMEDIA_EVENT_WINDOW_RESIZE: 
    796                     if (strm->vid_cb.on_event_cb) { 
    797                         if ((*strm->vid_cb.on_event_cb)(&strm->base, 
    798                                                         strm->user_data, 
    799                                                         &pevent) != PJ_SUCCESS) 
    800                         { 
    801                             break; 
    802                         } 
    803                     } 
    804                     strm->new_disp_size = &pevent.event_desc.resize.new_size; 
     788            if (pevent.type != PJMEDIA_EVENT_NONE) { 
     789                pj_status_t status; 
     790 
     791                status = pjmedia_event_publish(&strm->base.epub, &pevent); 
     792 
     793                switch (pevent.type) { 
     794                case PJMEDIA_EVENT_WND_RESIZED: 
     795                    strm->new_disp_size = &pevent.data.wnd_resized.new_size; 
    805796                    detect_fmt_change(strm); 
    806                     break; 
    807  
    808                 case PJMEDIA_EVENT_WINDOW_CLOSE: 
    809                     /** 
    810                      * To process PJMEDIA_EVENT_WINDOW_CLOSE event, 
    811                      * application should do this in the on_event_cb callback: 
    812                      * 1. stop further calls to  
    813                      *    #pjmedia_vid_dev_stream_put_frame() 
    814                      * 2. return PJ_SUCCESS 
    815                      * Upon returning from the callback, SDL will destroy its 
    816                      * own stream. 
    817                      * 
    818                      * Returning non-PJ_SUCCESS will cause SDL to ignore 
    819                      * the event 
    820                      */ 
    821                     if (strm->vid_cb.on_event_cb) { 
    822                         strm->is_quitting = PJ_TRUE; 
    823                         if ((*strm->vid_cb.on_event_cb)(&strm->base, 
    824                                                         strm->user_data, 
    825                                                         &pevent) != PJ_SUCCESS) 
    826                         { 
    827                             /* Application wants us to ignore this event */ 
    828                             strm->is_quitting = PJ_FALSE; 
    829                             break; 
    830                         } 
    831  
    832                         /* Destroy the stream */ 
    833                         sdl_stream_destroy(&strm->base); 
    834                         goto on_return; 
    835                     } 
    836  
    837                     /** 
    838                      * Default event-handler when there is no user-specified 
    839                      * callback: close the renderer window. We cannot destroy 
    840                      * the stream here since there is no callback to notify 
    841                      * the application. 
    842                      */ 
    843                     sdl_stream_stop(&strm->base); 
    844                     goto on_return; 
    845  
    846                 default: 
    847                     break; 
     797                    break; 
     798 
     799                case PJMEDIA_EVENT_WND_CLOSING: 
     800                    if (pevent.data.wnd_closing.cancel) { 
     801                        /* Cancel the closing operation */ 
     802                        break; 
     803                    } 
     804 
     805                    /* Proceed to cleanup SDL. App must still call 
     806                     * pjmedia_dev_stream_destroy() when getting WND_CLOSED 
     807                     * event 
     808                     */ 
     809                    strm->is_quitting = PJ_TRUE; 
     810                    notify_wnd_closed_event = PJ_TRUE; 
     811                    sdl_stream_stop(&strm->base); 
     812                    goto on_return; 
     813 
     814                default: 
     815                    /* Just to prevent gcc warning about unused enums */ 
     816                    break; 
     817                } 
    848818            } 
    849819        } 
     
    859829#endif 
    860830    strm->screen = NULL; 
    861  
    862     return strm->status; 
     831    saved_stream_status = strm->status; 
     832 
     833    if (notify_wnd_closed_event) { 
     834        pjmedia_event pevent; 
     835 
     836        pjmedia_event_init(&pevent, PJMEDIA_EVENT_WND_CLOSED, &strm->last_ts, 
     837                           &strm->base.epub); 
     838        pjmedia_event_publish(&strm->base.epub, &pevent); 
     839    } 
     840 
     841    /* 
     842     * Note: don't access the stream after this point, it  might have 
     843     * been destroyed 
     844     */ 
     845 
     846    return saved_stream_status; 
     847} 
     848 
     849static void hello_world() 
     850{ 
    863851} 
    864852 
     
    901889    struct sdl_stream *stream = (struct sdl_stream*)strm; 
    902890    pj_status_t status = PJ_SUCCESS; 
     891 
     892    stream->last_ts.u64 = frame->timestamp.u64; 
    903893 
    904894    if (!stream->is_running) { 
     
    10241014    pj_memcpy(&strm->vid_cb, cb, sizeof(*cb)); 
    10251015    strm->user_data = user_data; 
     1016    pjmedia_event_publisher_init(&strm->base.epub); 
    10261017 
    10271018    /* Create render stream here */ 
Note: See TracChangeset for help on using the changeset viewer.