- Timestamp:
- Jul 12, 2011 3:05:35 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/2.0-dev/pjmedia/src/pjmedia-videodev/sdl_dev.c
r3605 r3617 148 148 pjmedia_format *new_fmt; 149 149 pjmedia_rect_size *new_disp_size; 150 pj_timestamp last_ts; 150 151 151 152 #if SDL_VERSION_ATLEAST(1,3,0) … … 684 685 { 685 686 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; 686 689 #endif 687 690 … … 734 737 { 735 738 SDL_Event sevent; 736 pjmedia_ vid_event pevent;739 pjmedia_event pevent; 737 740 738 741 #if PJMEDIA_VIDEO_DEV_SDL_HAS_OPENGL … … 752 755 */ 753 756 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); 755 759 756 760 switch(sevent.type) { 757 761 case SDL_MOUSEBUTTONDOWN: 758 pevent. event_type = PJMEDIA_EVENT_MOUSEBUTTONDOWN;762 pevent.type = PJMEDIA_EVENT_MOUSE_BTN_DOWN; 759 763 break; 760 764 #if SDL_VERSION_ATLEAST(1,3,0) … … 762 766 switch (sevent.window.event) { 763 767 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 = 766 770 sevent.window.data1; 767 pevent. event_desc.resize.new_size.h =771 pevent.data.wnd_resized.new_size.h = 768 772 sevent.window.data2; 769 773 break; … … 772 776 #else 773 777 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; 777 781 break; 778 782 case SDL_QUIT: 779 pevent.event_type = PJMEDIA_EVENT_WINDOW_CLOSE; 783 pevent.type = PJMEDIA_EVENT_WND_CLOSING; 784 break; 780 785 #endif 781 786 } 782 787 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; 805 796 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 } 848 818 } 849 819 } … … 859 829 #endif 860 830 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 849 static void hello_world() 850 { 863 851 } 864 852 … … 901 889 struct sdl_stream *stream = (struct sdl_stream*)strm; 902 890 pj_status_t status = PJ_SUCCESS; 891 892 stream->last_ts.u64 = frame->timestamp.u64; 903 893 904 894 if (!stream->is_running) { … … 1024 1014 pj_memcpy(&strm->vid_cb, cb, sizeof(*cb)); 1025 1015 strm->user_data = user_data; 1016 pjmedia_event_publisher_init(&strm->base.epub); 1026 1017 1027 1018 /* Create render stream here */
Note: See TracChangeset
for help on using the changeset viewer.