Changeset 1156:189d790f3854 in mediastreamer2


Ignore:
Timestamp:
Sep 26, 2010 1:01:34 PM (3 years ago)
Author:
Simon Morlat <simon.morlat@…>
Branch:
default
Message:

implement changing of camera source

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • include/mediastreamer2/mediastream.h

    r1154 r1156  
    211211void video_stream_set_relay_session_id(VideoStream *stream, const char *relay_session_id); 
    212212void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const char *tool); 
     213void video_stream_change_camera(VideoStream *stream, MSWebCam *cam); 
    213214/*function to call periodically to handle various events */ 
    214215void video_stream_iterate(VideoStream *stream); 
  • src/videostream.c

    r1143 r1156  
    237237} 
    238238 
     239static void configure_video_source(VideoStream *stream){ 
     240        MSVideoSize vsize,cam_vsize; 
     241        float fps=15; 
     242        MSPixFmt format; 
     243         
     244        ms_filter_call_method(stream->encoder,MS_FILTER_GET_VIDEO_SIZE,&vsize); 
     245        vsize=ms_video_size_min(vsize,stream->sent_vsize); 
     246        ms_filter_call_method(stream->encoder,MS_FILTER_SET_VIDEO_SIZE,&vsize); 
     247        ms_filter_call_method(stream->encoder,MS_FILTER_GET_FPS,&fps); 
     248        ms_message("Setting sent vsize=%ix%i, fps=%f",vsize.width,vsize.height,fps); 
     249        /* configure the filters */ 
     250        if (ms_filter_get_id(stream->source)!=MS_STATIC_IMAGE_ID) { 
     251                ms_filter_call_method(stream->source,MS_FILTER_SET_FPS,&fps); 
     252        } 
     253        ms_filter_call_method(stream->source,MS_FILTER_SET_VIDEO_SIZE,&vsize); 
     254        /* get the output format for webcam reader */ 
     255        ms_filter_call_method(stream->source,MS_FILTER_GET_PIX_FMT,&format); 
     256        if (format==MS_MJPEG){ 
     257                stream->pixconv=ms_filter_new(MS_MJPEG_DEC_ID); 
     258        }else{ 
     259                stream->pixconv = ms_filter_new(MS_PIX_CONV_ID); 
     260                /*set it to the pixconv */ 
     261                ms_filter_call_method(stream->pixconv,MS_FILTER_SET_PIX_FMT,&format); 
     262                ms_filter_call_method(stream->source,MS_FILTER_GET_VIDEO_SIZE,&cam_vsize); 
     263                ms_filter_call_method(stream->pixconv,MS_FILTER_SET_VIDEO_SIZE,&cam_vsize); 
     264        } 
     265        stream->sizeconv=ms_filter_new(MS_SIZE_CONV_ID); 
     266        ms_filter_call_method(stream->sizeconv,MS_FILTER_SET_VIDEO_SIZE,&vsize); 
     267} 
     268 
    239269int video_stream_start (VideoStream *stream, RtpProfile *profile, const char *remip, int remport, 
    240270        int rem_rtcp_port, int payload, int jitt_comp, MSWebCam *cam){ 
     
    242272        RtpSession *rtps=stream->session; 
    243273        MSPixFmt format; 
    244         MSVideoSize vsize,cam_vsize,disp_size; 
    245         float fps=15; 
     274        MSVideoSize disp_size; 
    246275        int tmp; 
    247276        JBParameters jbp; 
     
    296325                        ms_filter_call_method(stream->encoder,MS_FILTER_ADD_FMTP,pt->send_fmtp); 
    297326                } 
    298                 ms_filter_call_method(stream->encoder,MS_FILTER_GET_VIDEO_SIZE,&vsize); 
    299                 vsize=ms_video_size_min(vsize,stream->sent_vsize); 
    300                 ms_filter_call_method(stream->encoder,MS_FILTER_SET_VIDEO_SIZE,&vsize); 
    301                 ms_filter_call_method(stream->encoder,MS_FILTER_GET_FPS,&fps); 
    302                 ms_message("Setting sent vsize=%ix%i, fps=%f",vsize.width,vsize.height,fps); 
    303                 /* configure the filters */ 
    304                 if (ms_filter_get_id(stream->source)!=MS_STATIC_IMAGE_ID) { 
    305                         ms_filter_call_method(stream->source,MS_FILTER_SET_FPS,&fps); 
    306                 } 
    307                 ms_filter_call_method(stream->source,MS_FILTER_SET_VIDEO_SIZE,&vsize); 
    308                 /* get the output format for webcam reader */ 
    309                 ms_filter_call_method(stream->source,MS_FILTER_GET_PIX_FMT,&format); 
    310                 if (format==MS_MJPEG){ 
    311                         stream->pixconv=ms_filter_new(MS_MJPEG_DEC_ID); 
    312                 }else{ 
    313                         stream->pixconv = ms_filter_new(MS_PIX_CONV_ID); 
    314                         /*set it to the pixconv */ 
    315                         ms_filter_call_method(stream->pixconv,MS_FILTER_SET_PIX_FMT,&format); 
    316                         ms_filter_call_method(stream->source,MS_FILTER_GET_VIDEO_SIZE,&cam_vsize); 
    317                         ms_filter_call_method(stream->pixconv,MS_FILTER_SET_VIDEO_SIZE,&cam_vsize); 
    318                 } 
    319                 stream->sizeconv=ms_filter_new(MS_SIZE_CONV_ID); 
    320                 ms_filter_call_method(stream->sizeconv,MS_FILTER_SET_VIDEO_SIZE,&vsize); 
     327                configure_video_source (stream); 
    321328                        /* and then connect all */ 
    322329                ms_filter_link (stream->source, 0, stream->pixconv, 0); 
     
    380387                ms_ticker_attach (stream->ticker, stream->rtprecv); 
    381388        return 0; 
     389} 
     390 
     391void video_stream_change_camera(VideoStream *stream, MSWebCam *cam){ 
     392        if (stream->ticker && stream->source){ 
     393                ms_ticker_detach(stream->ticker,stream->source); 
     394                /*unlink source filters and subsequent post processin filters */ 
     395                ms_filter_unlink (stream->source, 0, stream->pixconv, 0); 
     396                ms_filter_unlink (stream->pixconv, 0, stream->sizeconv, 0); 
     397                ms_filter_unlink (stream->sizeconv, 0, stream->tee, 0); 
     398                /*destroy the filters */ 
     399                ms_filter_destroy(stream->source); 
     400                ms_filter_destroy(stream->pixconv); 
     401                ms_filter_destroy(stream->sizeconv); 
     402 
     403                /*re create new ones and configure them*/ 
     404                stream->source = ms_web_cam_create_reader(cam); 
     405                configure_video_source(stream); 
     406                 
     407                ms_ticker_attach(stream->ticker,stream->source); 
     408        } 
    382409} 
    383410 
Note: See TracChangeset for help on using the changeset viewer.