1 /*****************************************************************************
2 * mpjpeg.c: mime multipart jpeg muxer module for vlc
3 *****************************************************************************
4 * Copyright (C) 2001, 2002 VideoLAN
5 * $Id: dummy.c 7047 2004-03-11 17:37:50Z fenrir $
7 * Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
32 #define SEPARATOR "\r\n--This Random String\r\n" \
33 "Content-Type: image/jpeg\r\n\r\n"
34 /*****************************************************************************
36 *****************************************************************************/
37 static int Open ( vlc_object_t
* );
38 static void Close ( vlc_object_t
* );
41 set_description( _("Multipart jpeg muxer") );
42 set_capability( "sout mux", 5 );
43 set_callbacks( Open
, Close
);
44 add_shortcut( "mpjpeg" );
47 /*****************************************************************************
49 *****************************************************************************/
50 static int Control ( sout_mux_t
*, int, va_list );
51 static int AddStream( sout_mux_t
*, sout_input_t
* );
52 static int DelStream( sout_mux_t
*, sout_input_t
* );
53 static int Mux ( sout_mux_t
* );
58 vlc_bool_t b_send_headers
;
61 /*****************************************************************************
63 *****************************************************************************/
64 static int Open( vlc_object_t
*p_this
)
66 sout_mux_t
*p_mux
= (sout_mux_t
*)p_this
;
67 sout_mux_sys_t
*p_sys
;
69 msg_Dbg( p_mux
, "Multipart jpeg muxer opened" );
71 p_mux
->pf_control
= Control
;
72 p_mux
->pf_addstream
= AddStream
;
73 p_mux
->pf_delstream
= DelStream
;
76 p_sys
= p_mux
->p_sys
= malloc( sizeof(sout_mux_sys_t
) );
77 p_sys
->b_send_headers
= VLC_TRUE
;
78 p_sys
->p_separator
= block_New( p_mux
, sizeof(SEPARATOR
) - 1 );
79 memcpy( p_sys
->p_separator
->p_buffer
, SEPARATOR
, sizeof(SEPARATOR
) - 1 );
84 /*****************************************************************************
86 *****************************************************************************/
88 static void Close( vlc_object_t
* p_this
)
90 sout_mux_t
*p_mux
= (sout_mux_t
*)p_this
;
91 sout_mux_sys_t
*p_sys
= p_mux
->p_sys
;
93 msg_Dbg( p_mux
, "Multipart jpeg muxer closed" );
94 block_Release( p_sys
->p_separator
);
98 static int Control( sout_mux_t
*p_mux
, int i_query
, va_list args
)
105 case MUX_CAN_ADD_STREAM_WHILE_MUXING
:
106 pb_bool
= (vlc_bool_t
*)va_arg( args
, vlc_bool_t
* );
110 case MUX_GET_ADD_STREAM_WAIT
:
111 pb_bool
= (vlc_bool_t
*)va_arg( args
, vlc_bool_t
* );
116 ppsz
= (char**)va_arg( args
, char ** );
117 *ppsz
= strdup( "multipart/x-mixed-replace; boundary=This Random String" );
125 static int AddStream( sout_mux_t
*p_mux
, sout_input_t
*p_input
)
127 if( p_mux
->i_nb_inputs
> 1 )
129 msg_Dbg( p_mux
, "only 1 input allowed" );
133 msg_Dbg( p_mux
, "adding input" );
134 if( p_input
->p_fmt
->i_codec
!= VLC_FOURCC('M','J','P','G') )
142 static int DelStream( sout_mux_t
*p_mux
, sout_input_t
*p_input
)
144 msg_Dbg( p_mux
, "removing input" );
148 static int Mux( sout_mux_t
*p_mux
)
150 block_fifo_t
*p_fifo
;
151 sout_mux_sys_t
*p_sys
= p_mux
->p_sys
;
154 if( p_sys
->b_send_headers
)
156 block_t
*p_header
= block_New( p_mux
, sizeof(SEPARATOR
) - 3);
157 memcpy( p_header
->p_buffer
, &SEPARATOR
[2], sizeof(SEPARATOR
) - 3 );
158 p_header
->i_flags
|= BLOCK_FLAG_HEADER
;
159 sout_AccessOutWrite( p_mux
->p_access
, p_header
);
160 p_sys
->b_send_headers
= VLC_FALSE
;
163 if( !p_mux
->i_nb_inputs
) return VLC_SUCCESS
;
165 p_fifo
= p_mux
->pp_inputs
[0]->p_fifo
;
166 i_count
= p_fifo
->i_depth
;
169 block_t
*p_data
= block_FifoGet( p_fifo
);
170 sout_AccessOutWrite( p_mux
->p_access
,
171 block_Duplicate( p_sys
->p_separator
) );
172 sout_AccessOutWrite( p_mux
->p_access
, p_data
);