Lines Matching refs:mux
57 static gboolean psmux_packet_out (PsMux * mux);
58 static gboolean psmux_write_pack_header (PsMux * mux);
59 static gboolean psmux_write_system_header (PsMux * mux);
60 static gboolean psmux_write_program_stream_map (PsMux * mux);
72 PsMux *mux; in psmux_new() local
74 mux = g_slice_new0 (PsMux); in psmux_new()
76 mux->pts = -1; /* uninitialized values */ in psmux_new()
77 mux->pack_hdr_pts = -1; in psmux_new()
78 mux->sys_hdr_pts = -1; in psmux_new()
79 mux->psm_pts = -1; in psmux_new()
81 mux->bit_pts = 0; in psmux_new()
83 mux->pes_max_payload = PSMUX_PES_MAX_PAYLOAD; in psmux_new()
84 mux->bit_rate = 400 * 1024; /* XXX: better default values? */ in psmux_new()
85 mux->rate_bound = 2 * 1024; /* 2* bit_rate / (8*50). XXX: any better default? */ in psmux_new()
87 mux->pack_hdr_freq = PSMUX_PACK_HDR_FREQ; in psmux_new()
88 mux->sys_hdr_freq = PSMUX_SYS_HDR_FREQ; in psmux_new()
89 mux->psm_freq = PSMUX_PSM_FREQ; in psmux_new()
91 psmux_stream_id_info_init (&mux->id_info); in psmux_new()
93 return mux; in psmux_new()
106 psmux_set_write_func (PsMux * mux, PsMuxWriteFunc func, void *user_data) in psmux_set_write_func() argument
108 g_return_if_fail (mux != NULL); in psmux_set_write_func()
110 mux->write_func = func; in psmux_set_write_func()
111 mux->write_func_data = user_data; in psmux_set_write_func()
115 psmux_write_end_code (PsMux * mux) in psmux_write_end_code() argument
118 return mux->write_func (end_code, 4, mux->write_func_data); in psmux_write_end_code()
130 psmux_free (PsMux * mux) in psmux_free() argument
134 g_return_if_fail (mux != NULL); in psmux_free()
137 for (cur = g_list_first (mux->streams); cur != NULL; cur = g_list_next (cur)) { in psmux_free()
142 g_list_free (mux->streams); in psmux_free()
144 if (mux->sys_header != NULL) in psmux_free()
145 gst_buffer_unref (mux->sys_header); in psmux_free()
147 if (mux->psm != NULL) in psmux_free()
148 gst_buffer_unref (mux->psm); in psmux_free()
150 g_slice_free (PsMux, mux); in psmux_free()
163 psmux_create_stream (PsMux * mux, PsMuxStreamType stream_type) in psmux_create_stream() argument
168 g_return_val_if_fail (mux != NULL, NULL); in psmux_create_stream()
172 new_pid = psmux_get_new_pid (mux); in psmux_create_stream()
178 if (psmux_find_stream (mux, new_pid)) in psmux_create_stream()
182 stream = psmux_stream_new (mux, stream_type); in psmux_create_stream()
184 mux->streams = g_list_prepend (mux->streams, stream); in psmux_create_stream()
186 if (!mux->nb_private_streams) in psmux_create_stream()
187 mux->nb_streams++; in psmux_create_stream()
188 mux->nb_private_streams++; in psmux_create_stream()
190 mux->nb_streams++; in psmux_create_stream()
193 mux->video_bound++; in psmux_create_stream()
194 if (mux->video_bound > 32) in psmux_create_stream()
197 mux->audio_bound++; in psmux_create_stream()
198 if (mux->audio_bound > 64) in psmux_create_stream()
206 psmux_packet_out (PsMux * mux) in psmux_packet_out() argument
209 if (G_UNLIKELY (mux->write_func == NULL)) in psmux_packet_out()
212 res = mux->write_func (mux->packet_buf, mux->packet_bytes_written, in psmux_packet_out()
213 mux->write_func_data); in psmux_packet_out()
216 mux->bit_size += mux->packet_bytes_written; in psmux_packet_out()
218 mux->packet_bytes_written = 0; in psmux_packet_out()
232 psmux_write_stream_packet (PsMux * mux, PsMuxStream * stream) in psmux_write_stream_packet() argument
236 g_return_val_if_fail (mux != NULL, FALSE); in psmux_write_stream_packet()
243 mux->pts = ts; in psmux_write_stream_packet()
246 if (mux->pts - mux->pack_hdr_pts > PSMUX_PACK_HDR_INTERVAL in psmux_write_stream_packet()
247 || mux->pes_cnt % mux->pack_hdr_freq == 0) { in psmux_write_stream_packet()
255 if (mux->pts != -1 && mux->pts > mux->bit_pts in psmux_write_stream_packet()
256 && mux->pts - mux->bit_pts > PSMUX_BITRATE_CALC_INTERVAL) { in psmux_write_stream_packet()
258 mux->bit_rate = in psmux_write_stream_packet()
259 gst_util_uint64_scale (mux->bit_size, 8 * CLOCKBASE, in psmux_write_stream_packet()
260 (mux->pts - mux->bit_pts)); in psmux_write_stream_packet()
262 mux->bit_size = 0; in psmux_write_stream_packet()
263 mux->bit_pts = mux->pts; in psmux_write_stream_packet()
266 psmux_write_pack_header (mux); in psmux_write_stream_packet()
267 mux->pack_hdr_pts = mux->pts; in psmux_write_stream_packet()
270 if (mux->pes_cnt % mux->sys_hdr_freq == 0) { in psmux_write_stream_packet()
272 psmux_write_system_header (mux); in psmux_write_stream_packet()
273 mux->sys_hdr_pts = mux->pts; in psmux_write_stream_packet()
276 if (mux->pes_cnt % mux->psm_freq == 0) { in psmux_write_stream_packet()
278 psmux_write_program_stream_map (mux); in psmux_write_stream_packet()
279 mux->psm_pts = mux->pts; in psmux_write_stream_packet()
283 if (!(mux->packet_bytes_written = in psmux_write_stream_packet()
284 psmux_stream_get_data (stream, mux->packet_buf, in psmux_write_stream_packet()
285 mux->pes_max_payload + PSMUX_PES_MAX_HDR_LEN))) { in psmux_write_stream_packet()
289 res = psmux_packet_out (mux); in psmux_write_stream_packet()
291 GST_DEBUG_OBJECT (mux, "packet write false"); in psmux_write_stream_packet()
295 mux->pes_cnt += 1; in psmux_write_stream_packet()
301 psmux_write_pack_header (PsMux * mux) in psmux_write_pack_header() argument
304 guint64 scr = mux->pts; /* XXX: is this correct? necessary to put any offset? */ in psmux_write_pack_header()
305 if (mux->pts == -1) in psmux_write_pack_header()
309 bits_initwrite (&bw, 14, mux->packet_buf); in psmux_write_pack_header()
327 gst_util_uint64_scale (mux->bit_rate + 8 * 50 - 1, 1, 8 * 50); in psmux_write_pack_header()
328 if (mux_rate > mux->rate_bound / 2) in psmux_write_pack_header()
329 mux->rate_bound = mux_rate * 2; in psmux_write_pack_header()
337 mux->packet_bytes_written = 14; in psmux_write_pack_header()
338 return psmux_packet_out (mux); in psmux_write_pack_header()
342 psmux_ensure_system_header (PsMux * mux) in psmux_ensure_system_header() argument
345 guint len = 12 + (mux->nb_streams + in psmux_ensure_system_header()
346 (mux->nb_private_streams > 1 ? mux->nb_private_streams - 1 : 0)) * 3; in psmux_ensure_system_header()
351 if (mux->sys_header != NULL) in psmux_ensure_system_header()
364 bits_write (&bw, 22, mux->rate_bound); /* rate_bound */ in psmux_ensure_system_header()
366 bits_write (&bw, 6, mux->audio_bound); /* audio_bound */ in psmux_ensure_system_header()
372 bits_write (&bw, 5, mux->video_bound); /* video_bound */ in psmux_ensure_system_header()
376 for (cur = mux->streams, private_hit = FALSE; cur != NULL; cur = cur->next) { in psmux_ensure_system_header()
393 mux->sys_header = gst_buffer_new_wrapped (data, len); in psmux_ensure_system_header()
397 psmux_write_system_header (PsMux * mux) in psmux_write_system_header() argument
401 psmux_ensure_system_header (mux); in psmux_write_system_header()
403 gst_buffer_map (mux->sys_header, &map, GST_MAP_READ); in psmux_write_system_header()
404 memcpy (mux->packet_buf, map.data, map.size); in psmux_write_system_header()
405 mux->packet_bytes_written = map.size; in psmux_write_system_header()
406 gst_buffer_unmap (mux->sys_header, &map); in psmux_write_system_header()
408 return psmux_packet_out (mux); in psmux_write_system_header()
412 psmux_ensure_program_stream_map (PsMux * mux) in psmux_ensure_program_stream_map() argument
421 if (mux->psm != NULL) in psmux_ensure_program_stream_map()
425 pos = mux->es_info_buf; in psmux_ensure_program_stream_map()
426 for (cur = mux->streams; cur != NULL; cur = cur->next) { in psmux_ensure_program_stream_map()
466 memcpy (bw.p_data + bw.i_data, mux->es_info_buf, es_map_size); in psmux_ensure_program_stream_map()
477 mux->psm = gst_buffer_new_wrapped (data, psm_size); in psmux_ensure_program_stream_map()
481 psmux_write_program_stream_map (PsMux * mux) in psmux_write_program_stream_map() argument
485 psmux_ensure_program_stream_map (mux); in psmux_write_program_stream_map()
487 gst_buffer_map (mux->psm, &map, GST_MAP_READ); in psmux_write_program_stream_map()
488 memcpy (mux->packet_buf, map.data, map.size); in psmux_write_program_stream_map()
489 mux->packet_bytes_written = map.size; in psmux_write_program_stream_map()
490 gst_buffer_unmap (mux->psm, &map); in psmux_write_program_stream_map()
492 return psmux_packet_out (mux); in psmux_write_program_stream_map()
496 psmux_get_stream_headers (PsMux * mux) in psmux_get_stream_headers() argument
500 psmux_ensure_system_header (mux); in psmux_get_stream_headers()
501 psmux_ensure_program_stream_map (mux); in psmux_get_stream_headers()
503 list = g_list_append (NULL, gst_buffer_ref (mux->sys_header)); in psmux_get_stream_headers()
504 list = g_list_append (list, gst_buffer_ref (mux->psm)); in psmux_get_stream_headers()