Merge branch 'master' into 0.11

Conflicts:
	gst/colorspace/colorspace.c
This commit is contained in:
Wim Taymans 2011-11-09 12:19:04 +01:00
commit dbdaa23742
20 changed files with 216 additions and 76 deletions

View file

@ -8,6 +8,7 @@ GST_PLUGINS_BAD_BUILT_SOURCES := \
pkgconfig/gstreamer-plugins-bad-0.10.pc \
gst-libs/gst/baseparse/Android.mk \
gst-libs/gst/basecamerabinsrc/Android.mk \
gst-libs/gst/codecparsers/Android.mk \
gst-libs/gst/interfaces/Android.mk \
gst/h264parse/Android.mk \
gst/videoparsers/Android.mk \
@ -102,6 +103,7 @@ CONFIGURE_TARGETS += gst-plugins-bad-configure
-include $(GST_PLUGINS_BAD_TOP)/gst-libs/gst/baseparse/Android.mk
-include $(GST_PLUGINS_BAD_TOP)/gst-libs/gst/basecamerabinsrc/Android.mk
-include $(GST_PLUGINS_BAD_TOP)/gst-libs/gst/codecparsers/Android.mk
-include $(GST_PLUGINS_BAD_TOP)/gst-libs/gst/interfaces/Android.mk
-include $(GST_PLUGINS_BAD_TOP)/gst/h264parse/Android.mk
-include $(GST_PLUGINS_BAD_TOP)/gst/audiobuffer/Android.mk

View file

@ -494,7 +494,7 @@ gst_celt_enc_src_query (GstPad * pad, GstQuery * query)
GstClockTime min_latency, max_latency;
gint64 latency;
if ((res = gst_pad_peer_query (pad, query))) {
if ((res = gst_pad_peer_query (enc->sinkpad, query))) {
gst_query_parse_latency (query, &live, &min_latency, &max_latency);
latency = gst_celt_enc_get_latency (enc);
@ -820,7 +820,7 @@ gst_celt_enc_encode (GstCeltEnc * enc, gboolean flush)
}
if (flush && gst_adapter_available (enc->adapter) % bytes != 0) {
guint diff = gst_adapter_available (enc->adapter) % bytes;
guint diff = bytes - gst_adapter_available (enc->adapter) % bytes;
GstBuffer *buf = gst_buffer_new_and_alloc (diff);
memset (GST_BUFFER_DATA (buf), 0, diff);

View file

@ -121,7 +121,8 @@ enum
ARG_DEFAULT_BACKGROUND_RED,
ARG_DEFAULT_BACKGROUND_GREEN,
ARG_DEFAULT_BACKGROUND_BLUE,
ARG_DEFAULT_BACKGROUND_ALPHA
ARG_DEFAULT_BACKGROUND_ALPHA,
ARG_SILENT
};
static GstStaticPadTemplate kate_sink_factory =
@ -294,6 +295,12 @@ gst_kate_tiger_class_init (GstKateTigerClass * klass)
"Default background color (alpha component, between 0 and 255) to render text with",
0, 255, 255, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* FIXME 0.11: rename to "visible" or "text-visible" or "render-text" */
g_object_class_install_property (gobject_class, ARG_SILENT,
g_param_spec_boolean ("silent", "silent",
"Whether to render the stream",
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gstelement_class->change_state =
GST_DEBUG_FUNCPTR (gst_kate_tiger_change_state);
}
@ -353,6 +360,7 @@ gst_kate_tiger_init (GstKateTiger * tiger, GstKateTigerClass * gclass)
tiger->default_background_g = 0;
tiger->default_background_b = 0;
tiger->default_background_a = 0;
tiger->silent = FALSE;
tiger->video_width = 0;
tiger->video_height = 0;
@ -488,6 +496,9 @@ gst_kate_tiger_set_property (GObject * object, guint prop_id,
tiger->default_background_a = g_value_get_int (value);
gst_kate_tiger_update_default_background_color (tiger);
break;
case ARG_SILENT:
tiger->silent = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -542,6 +553,9 @@ gst_kate_tiger_get_property (GObject * object, guint prop_id,
case ARG_DEFAULT_BACKGROUND_ALPHA:
g_value_set_int (value, tiger->default_background_a);
break;
case ARG_SILENT:
g_value_set_boolean (value, tiger->silent);
break;
default:
if (!gst_kate_util_decoder_base_get_property (&tiger->decoder, object,
prop_id, value, pspec)) {
@ -767,7 +781,7 @@ gst_kate_tiger_video_chain (GstPad * pad, GstBuffer * buf)
}
/* if there nothing to draw, we can just push the video buffer as is */
if (ret > 0)
if (ret > 0 || tiger->silent)
goto pass;
/* there is something to draw, so first make the buffer writable */

View file

@ -88,6 +88,7 @@ struct _GstKateTiger
guchar default_background_g;
guchar default_background_b;
guchar default_background_a;
gboolean silent;
gint video_width;
gint video_height;

View file

@ -270,7 +270,7 @@ gst_opus_enc_sink_setcaps (GstPad * pad, GstCaps * caps)
gst_caps_unref (otherpadcaps);
}
GST_ERROR_OBJECT (pad, "channels=%d rate=%d frame-size=%d",
GST_DEBUG_OBJECT (pad, "channels=%d rate=%d frame-size=%d",
enc->n_channels, enc->sample_rate, enc->frame_size);
switch (enc->frame_size) {
case 2:
@ -296,7 +296,7 @@ gst_opus_enc_sink_setcaps (GstPad * pad, GstCaps * caps)
return FALSE;
break;
}
GST_ERROR ("frame_samples %d", enc->frame_samples);
GST_DEBUG_OBJECT (pad, "frame_samples %d", enc->frame_samples);
gst_opus_enc_setup (enc);
@ -534,7 +534,7 @@ gst_opus_enc_src_query (GstPad * pad, GstQuery * query)
GstClockTime min_latency, max_latency;
gint64 latency;
if ((res = gst_pad_peer_query (pad, query))) {
if ((res = gst_pad_peer_query (enc->sinkpad, query))) {
gst_query_parse_latency (query, &live, &min_latency, &max_latency);
latency = gst_opus_enc_get_latency (enc);
@ -807,7 +807,7 @@ gst_opus_enc_encode (GstOpusEnc * enc, gboolean flush)
(enc->bitrate * enc->frame_samples / enc->sample_rate + 4) / 8;
if (flush && gst_adapter_available (enc->adapter) % bytes != 0) {
guint diff = gst_adapter_available (enc->adapter) % bytes;
guint diff = bytes - gst_adapter_available (enc->adapter) % bytes;
GstBuffer *buf = gst_buffer_new_and_alloc (diff);
memset (GST_BUFFER_DATA (buf), 0, diff);

View file

@ -2400,7 +2400,7 @@ rsn_dvdsrc_src_event (GstBaseSrc * basesrc, GstEvent * event)
GST_LOG_OBJECT (src, "handling seek event");
gst_event_parse_seek (event, NULL, NULL, &flags, NULL, NULL, NULL, NULL);
src->flushing_seek = !!(flags & GST_SEEK_FLAG_FLUSH);
src->flushing_seek = ! !(flags & GST_SEEK_FLAG_FLUSH);
GST_DEBUG_OBJECT (src, "%s seek event",
src->flushing_seek ? "flushing" : "non-flushing");
@ -2759,7 +2759,12 @@ rsn_dvdsrc_do_seek (GstBaseSrc * bsrc, GstSegment * segment)
if (dvdnav_current_title_info (src->dvdnav, &title, &x) ==
DVDNAV_STATUS_OK) {
if (segment->start + 1 == x) {
dvdnav_prev_pg_search (src->dvdnav);
/* if already on the first part, don't try to get before it */
if (segment->start == 0) {
dvdnav_part_play (src->dvdnav, title, 1);
} else {
dvdnav_prev_pg_search (src->dvdnav);
}
ret = TRUE;
src->discont = TRUE;
} else if (segment->start == x + 1) {

View file

@ -319,7 +319,7 @@ scan_for_start_codes (const GstByteReader * reader, guint offset, guint size)
* Returns: a #GList of #GstMpegVideoTypeOffsetSize
*/
GList *
gst_mpeg_video_parse (guint8 * data, gsize size, guint offset)
gst_mpeg_video_parse (const guint8 * data, gsize size, guint offset)
{
gint off, rsize;
GstByteReader br;
@ -385,7 +385,7 @@ gst_mpeg_video_parse (guint8 * data, gsize size, guint offset)
*/
gboolean
gst_mpeg_video_parse_sequence_header (GstMpegVideoSequenceHdr * seqhdr,
guint8 * data, gsize size, guint offset)
const guint8 * data, gsize size, guint offset)
{
GstBitReader br;
@ -414,7 +414,7 @@ gst_mpeg_video_parse_sequence_header (GstMpegVideoSequenceHdr * seqhdr,
*/
gboolean
gst_mpeg_video_parse_sequence_extension (GstMpegVideoSequenceExt * seqext,
guint8 * data, gsize size, guint offset)
const guint8 * data, gsize size, guint offset)
{
GstBitReader br;
@ -482,7 +482,7 @@ gst_mpeg_video_parse_sequence_extension (GstMpegVideoSequenceExt * seqext,
*/
gboolean
gst_mpeg_video_parse_quant_matrix_extension (GstMpegVideoQuantMatrixExt * quant,
guint8 * data, gsize size, guint offset)
const guint8 * data, gsize size, guint offset)
{
guint8 i;
GstBitReader br;
@ -556,7 +556,7 @@ failed:
*/
gboolean
gst_mpeg_video_parse_picture_extension (GstMpegVideoPictureExt * ext,
guint8 * data, gsize size, guint offset)
const guint8 * data, gsize size, guint offset)
{
GstBitReader br;
@ -657,7 +657,7 @@ failed:
*/
gboolean
gst_mpeg_video_parse_picture_header (GstMpegVideoPictureHdr * hdr,
guint8 * data, gsize size, guint offset)
const guint8 * data, gsize size, guint offset)
{
GstBitReader br;
@ -728,7 +728,7 @@ failed:
* Returns: %TRUE if the gop could be parsed correctly, %FALSE otherwize.
*/
gboolean
gst_mpeg_video_parse_gop (GstMpegVideoGop * gop, guint8 * data,
gst_mpeg_video_parse_gop (GstMpegVideoGop * gop, const guint8 * data,
gsize size, guint offset)
{
GstBitReader br;

View file

@ -375,25 +375,25 @@ struct _GstMpegVideoTypeOffsetSize
gint size;
};
GList *gst_mpeg_video_parse (guint8 * data, gsize size, guint offset);
GList *gst_mpeg_video_parse (const guint8 * data, gsize size, guint offset);
gboolean gst_mpeg_video_parse_sequence_header (GstMpegVideoSequenceHdr * params,
guint8 * data, gsize size, guint offset);
const guint8 * data, gsize size, guint offset);
gboolean gst_mpeg_video_parse_picture_header (GstMpegVideoPictureHdr* hdr,
guint8 * data, gsize size, guint offset);
const guint8 * data, gsize size, guint offset);
gboolean gst_mpeg_video_parse_picture_extension (GstMpegVideoPictureExt *ext,
guint8 * data, gsize size, guint offset);
const guint8 * data, gsize size, guint offset);
gboolean gst_mpeg_video_parse_gop (GstMpegVideoGop * gop,
guint8 * data, gsize size, guint offset);
const guint8 * data, gsize size, guint offset);
gboolean gst_mpeg_video_parse_sequence_extension (GstMpegVideoSequenceExt * seqext,
guint8 * data, gsize size, guint offset);
const guint8 * data, gsize size, guint offset);
gboolean gst_mpeg_video_parse_quant_matrix_extension (GstMpegVideoQuantMatrixExt * quant,
guint8 * data, gsize size, guint offset);
const guint8 * data, gsize size, guint offset);
G_END_DECLS

View file

@ -199,21 +199,21 @@ adpcmdec_sink_setcaps (GstPad * pad, GstCaps * caps)
*
*=====================================================================
*/
static int AdaptationTable[] = {
static const int AdaptationTable[] = {
230, 230, 230, 230, 307, 409, 512, 614,
768, 614, 512, 409, 307, 230, 230, 230
};
static int AdaptCoeff1[] = {
static const int AdaptCoeff1[] = {
256, 512, 0, 192, 240, 460, 392
};
static int AdaptCoeff2[] = {
static const int AdaptCoeff2[] = {
0, -256, 0, 64, 0, -208, -232
};
static gint16
read_sample (guint8 * data)
read_sample (const guint8 * data)
{
guint16 val = data[0] | (data[1] << 8);
return *((gint16 *) & val);
@ -225,7 +225,7 @@ read_sample (guint8 * data)
All buffer lengths have been verified by the caller
*/
static gboolean
adpcmdec_decode_ms_block (ADPCMDec * dec, int n_samples, guint8 * data,
adpcmdec_decode_ms_block (ADPCMDec * dec, int n_samples, const guint8 * data,
gint16 * samples)
{
gint16 pred[2];
@ -298,11 +298,11 @@ adpcmdec_decode_ms_block (ADPCMDec * dec, int n_samples, guint8 * data,
return TRUE;
}
static int ima_indx_adjust[16] = {
static const int ima_indx_adjust[16] = {
-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8,
};
static int ima_step_size[89] = {
static const int ima_step_size[89] = {
7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230,
253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
@ -318,7 +318,7 @@ static int ima_step_size[89] = {
All buffer lengths have been verified by the caller
*/
static gboolean
adpcmdec_decode_ima_block (ADPCMDec * dec, int n_samples, guint8 * data,
adpcmdec_decode_ima_block (ADPCMDec * dec, int n_samples, const guint8 * data,
gint16 * samples)
{
gint16 stepindex[2];
@ -378,7 +378,7 @@ adpcmdec_decode_ima_block (ADPCMDec * dec, int n_samples, guint8 * data,
}
static GstFlowReturn
adpcmdec_decode_block (ADPCMDec * dec, guint8 * data, int blocksize)
adpcmdec_decode_block (ADPCMDec * dec, const guint8 * data, int blocksize)
{
gboolean res;
GstBuffer *outbuf = NULL;

View file

@ -66,11 +66,11 @@ static GstStaticPadTemplate adpcmenc_src_template =
#define DEFAULT_ADPCM_BLOCK_SIZE 1024
#define DEFAULT_ADPCM_LAYOUT LAYOUT_ADPCM_DVI
static int ima_indx_adjust[16] = {
static const int ima_indx_adjust[16] = {
-1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8,
};
static int ima_step_size[89] = {
static const int ima_step_size[89] = {
7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230,
253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963,
@ -302,7 +302,8 @@ adpcmenc_encode_ima_sample (gint16 sample, gint16 * prev_sample,
}
static gboolean
adpcmenc_encode_ima_block (ADPCMEnc * enc, gint16 * samples, guint8 * outbuf)
adpcmenc_encode_ima_block (ADPCMEnc * enc, const gint16 * samples,
guint8 * outbuf)
{
const int HEADER_SIZE = 4;
gint16 prev_sample[2] = { 0, 0 };
@ -368,7 +369,7 @@ adpcmenc_encode_ima_block (ADPCMEnc * enc, gint16 * samples, guint8 * outbuf)
}
static GstFlowReturn
adpcmenc_encode_block (ADPCMEnc * enc, gint16 * samples, int blocksize)
adpcmenc_encode_block (ADPCMEnc * enc, const gint16 * samples, int blocksize)
{
gboolean res;
GstBuffer *outbuf = NULL;

View file

@ -1277,14 +1277,10 @@ gst_auto_convert_sink_getcaps (GstPad * pad)
if (element_caps) {
if (!gst_caps_is_any (element_caps) &&
!gst_caps_is_empty (element_caps)) {
GstCaps *tmpcaps = NULL;
tmpcaps = gst_caps_union (caps, element_caps);
gst_caps_unref (caps);
caps = tmpcaps;
gst_caps_merge (caps, element_caps);
} else {
gst_caps_unref (element_caps);
}
gst_caps_unref (element_caps);
}
gst_object_unref (element);
@ -1298,11 +1294,7 @@ gst_auto_convert_sink_getcaps (GstPad * pad)
if (static_caps && !gst_caps_is_any (static_caps) &&
!gst_caps_is_empty (static_caps)) {
GstCaps *tmpcaps = NULL;
tmpcaps = gst_caps_union (caps, static_caps);
gst_caps_unref (caps);
caps = tmpcaps;
gst_caps_merge (caps, static_caps);
}
}
}

View file

@ -243,7 +243,7 @@ static guint camerabin_signals[LAST_SIGNAL];
#define DEFAULT_MODE MODE_IMAGE
#define DEFAULT_LOCATION "cap_%d"
#define DEFAULT_POST_PREVIEWS TRUE
#define DEFAULT_POST_PREVIEWS FALSE
#define DEFAULT_MUTE_AUDIO FALSE
#define DEFAULT_IDLE TRUE
#define DEFAULT_FLAGS 0
@ -957,6 +957,7 @@ static void
gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
{
GstCameraBin2 *camerabin = GST_CAMERA_BIN2_CAST (bin);
gboolean dec_counter = FALSE;
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ELEMENT:{
@ -964,7 +965,6 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
const gchar *filename;
if (gst_structure_has_name (structure, "GstMultiFileSink")) {
GST_CAMERA_BIN2_PROCESSING_DEC (GST_CAMERA_BIN2_CAST (bin));
filename = gst_structure_get_string (structure, "filename");
GST_DEBUG_OBJECT (bin, "Got file save message from multifilesink, "
"image %s has been saved", filename);
@ -972,6 +972,7 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
gst_image_capture_bin_post_image_done (GST_CAMERA_BIN2_CAST (bin),
filename);
}
dec_counter = TRUE;
} else if (gst_structure_has_name (structure, "preview-image")) {
GValue *value;
gchar *location = NULL;
@ -1001,7 +1002,7 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
}
GST_LOG_OBJECT (bin, "received preview-image message");
GST_CAMERA_BIN2_PROCESSING_DEC (GST_CAMERA_BIN2_CAST (bin));
dec_counter = TRUE;
}
}
break;
@ -1014,10 +1015,10 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
/* some capturing failed */
GST_WARNING_OBJECT (bin, "Capture failed, reason: %s - %s",
err->message, debug);
GST_CAMERA_BIN2_PROCESSING_DEC (GST_CAMERA_BIN2_CAST (bin));
if (camerabin->post_previews) {
gst_camera_bin_skip_next_preview (camerabin);
}
dec_counter = TRUE;
}
}
break;
@ -1025,8 +1026,8 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
GstElement *src = GST_ELEMENT (GST_MESSAGE_SRC (message));
if (src == GST_CAMERA_BIN2_CAST (bin)->videosink) {
GST_DEBUG_OBJECT (bin, "EOS from video branch");
GST_CAMERA_BIN2_PROCESSING_DEC (GST_CAMERA_BIN2_CAST (bin));
gst_video_capture_bin_post_video_done (GST_CAMERA_BIN2_CAST (bin));
dec_counter = TRUE;
}
}
break;
@ -1035,6 +1036,9 @@ gst_camera_bin_handle_message (GstBin * bin, GstMessage * message)
}
if (message)
GST_BIN_CLASS (parent_class)->handle_message (bin, message);
if (dec_counter)
GST_CAMERA_BIN2_PROCESSING_DEC (camerabin);
}
/*

View file

@ -110,6 +110,12 @@
* gst_element_send_event (pipeline, event);
* </programlisting>
*
* When a DTMF tone actually starts or stop, a "dtmf-event-processed"
* element #GstMessage with the same fields as the "dtmf-event"
* #GstEvent that was used to request the event. Also, if any event
* has not been processed when the element goes from the PAUSED to the
* READY state, then a "dtmf-event-dropped" message is posted on the
* #GstBus in the order that they were received.
*/
#ifdef HAVE_CONFIG_H
@ -324,6 +330,9 @@ gst_dtmf_src_handle_dtmf_event (GstDTMFSrc * dtmfsrc,
gboolean start;
gint method;
GstClockTime last_stop;
gint event_number;
gint event_volume;
gboolean correct_order;
if (!gst_structure_get_int (event_structure, "type", &event_type) ||
!gst_structure_get_boolean (event_structure, "start", &start) ||
@ -336,22 +345,25 @@ gst_dtmf_src_handle_dtmf_event (GstDTMFSrc * dtmfsrc,
}
}
if (start)
if (!gst_structure_get_int (event_structure, "number", &event_number) ||
!gst_structure_get_int (event_structure, "volume", &event_volume))
goto failure;
GST_OBJECT_LOCK (dtmfsrc);
if (gst_structure_get_clock_time (event_structure, "last-stop", &last_stop))
dtmfsrc->last_stop = last_stop;
else
dtmfsrc->last_stop = GST_CLOCK_TIME_NONE;
correct_order = (start != dtmfsrc->last_event_was_start);
dtmfsrc->last_event_was_start = start;
GST_OBJECT_UNLOCK (dtmfsrc);
if (!correct_order)
goto failure;
if (start) {
gint event_number;
gint event_volume;
if (!gst_structure_get_int (event_structure, "number", &event_number) ||
!gst_structure_get_int (event_structure, "volume", &event_volume))
goto failure;
GST_DEBUG_OBJECT (dtmfsrc, "Received start event %d with volume %d",
event_number, event_volume);
gst_dtmf_src_add_start_event (dtmfsrc, event_number, event_volume);
@ -625,6 +637,35 @@ gst_dtmf_src_create_next_tone_packet (GstDTMFSrc * dtmfsrc,
return buf;
}
static void
gst_dtmf_src_post_message (GstDTMFSrc * dtmfsrc, const gchar * message_name,
GstDTMFSrcEvent * event)
{
GstStructure *s = NULL;
switch (event->event_type) {
case DTMF_EVENT_TYPE_START:
s = gst_structure_new (message_name,
"type", G_TYPE_INT, 1,
"method", G_TYPE_INT, 2,
"start", G_TYPE_BOOLEAN, TRUE,
"number", G_TYPE_INT, event->event_number,
"volume", G_TYPE_INT, event->volume, NULL);
break;
case DTMF_EVENT_TYPE_STOP:
s = gst_structure_new (message_name,
"type", G_TYPE_INT, 1, "method", G_TYPE_INT, 2,
"start", G_TYPE_BOOLEAN, FALSE, NULL);
break;
case DTMF_EVENT_TYPE_PAUSE_TASK:
return;
}
if (s)
gst_element_post_message (GST_ELEMENT (dtmfsrc),
gst_message_new_element (GST_OBJECT (dtmfsrc), s));
}
static GstFlowReturn
gst_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
guint length, GstBuffer ** buffer)
@ -650,6 +691,7 @@ gst_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
case DTMF_EVENT_TYPE_STOP:
GST_WARNING_OBJECT (dtmfsrc,
"Received a DTMF stop event when already stopped");
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
break;
case DTMF_EVENT_TYPE_START:
gst_dtmf_prepare_timestamps (dtmfsrc);
@ -657,6 +699,8 @@ gst_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
event->packet_count = 0;
dtmfsrc->last_event = event;
event = NULL;
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-processed",
dtmfsrc->last_event);
break;
case DTMF_EVENT_TYPE_PAUSE_TASK:
/*
@ -684,10 +728,12 @@ gst_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
case DTMF_EVENT_TYPE_START:
GST_WARNING_OBJECT (dtmfsrc,
"Received two consecutive DTMF start events");
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
break;
case DTMF_EVENT_TYPE_STOP:
g_slice_free (GstDTMFSrcEvent, dtmfsrc->last_event);
dtmfsrc->last_event = NULL;
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-processed", event);
break;
case DTMF_EVENT_TYPE_PAUSE_TASK:
/*
@ -853,9 +899,11 @@ gst_dtmf_src_change_state (GstElement * element, GstStateChange transition)
event = g_async_queue_try_pop (dtmfsrc->event_queue);
while (event != NULL) {
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
g_slice_free (GstDTMFSrcEvent, event);
event = g_async_queue_try_pop (dtmfsrc->event_queue);
}
dtmfsrc->last_event_was_start = FALSE;
dtmfsrc->timestamp = 0;
no_preroll = TRUE;
break;
@ -878,9 +926,11 @@ gst_dtmf_src_change_state (GstElement * element, GstStateChange transition)
event = g_async_queue_try_pop (dtmfsrc->event_queue);
while (event != NULL) {
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
g_slice_free (GstDTMFSrcEvent, event);
event = g_async_queue_try_pop (dtmfsrc->event_queue);
}
dtmfsrc->last_event_was_start = FALSE;
break;
default:

View file

@ -74,6 +74,7 @@ struct _GstDTMFSrc
GstBaseSrc parent;
GAsyncQueue *event_queue;
GstDTMFSrcEvent *last_event;
gboolean last_event_was_start;
guint16 interval;
GstClockTime timestamp;

View file

@ -108,7 +108,13 @@
* gst_element_send_event (pipeline, event);
* </programlisting>
*
*/
* When a DTMF tone actually starts or stop, a "dtmf-event-processed"
* element #GstMessage with the same fields as the "dtmf-event"
* #GstEvent that was used to request the event. Also, if any event
* has not been processed when the element goes from the PAUSED to the
* READY state, then a "dtmf-event-dropped" message is posted on the
* #GstBus in the order that they were received.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
@ -335,6 +341,9 @@ gst_rtp_dtmf_src_handle_dtmf_event (GstRTPDTMFSrc * dtmfsrc,
gboolean start;
gint method;
GstClockTime last_stop;
gint event_number;
gint event_volume;
gboolean correct_order;
if (!gst_structure_get_int (event_structure, "type", &event_type) ||
!gst_structure_get_boolean (event_structure, "start", &start) ||
@ -347,17 +356,24 @@ gst_rtp_dtmf_src_handle_dtmf_event (GstRTPDTMFSrc * dtmfsrc,
}
}
if (start)
if (!gst_structure_get_int (event_structure, "number", &event_number) ||
!gst_structure_get_int (event_structure, "volume", &event_volume))
goto failure;
GST_OBJECT_LOCK (dtmfsrc);
if (gst_structure_get_clock_time (event_structure, "last-stop", &last_stop))
dtmfsrc->last_stop = last_stop;
else
dtmfsrc->last_stop = GST_CLOCK_TIME_NONE;
correct_order = (start != dtmfsrc->last_event_was_start);
dtmfsrc->last_event_was_start = start;
GST_OBJECT_UNLOCK (dtmfsrc);
if (start) {
gint event_number;
gint event_volume;
if (!correct_order)
goto failure;
if (start) {
if (!gst_structure_get_int (event_structure, "number", &event_number) ||
!gst_structure_get_int (event_structure, "volume", &event_volume))
goto failure;
@ -644,6 +660,37 @@ gst_rtp_dtmf_src_create_next_rtp_packet (GstRTPDTMFSrc * dtmfsrc)
return buf;
}
static void
gst_dtmf_src_post_message (GstRTPDTMFSrc * dtmfsrc, const gchar * message_name,
GstRTPDTMFSrcEvent * event)
{
GstStructure *s = NULL;
switch (event->event_type) {
case RTP_DTMF_EVENT_TYPE_START:
s = gst_structure_new (message_name,
"type", G_TYPE_INT, 1,
"method", G_TYPE_INT, 1,
"start", G_TYPE_BOOLEAN, TRUE,
"number", G_TYPE_INT, event->payload->event,
"volume", G_TYPE_INT, event->payload->volume, NULL);
break;
case RTP_DTMF_EVENT_TYPE_STOP:
s = gst_structure_new (message_name,
"type", G_TYPE_INT, 1, "method", G_TYPE_INT, 1,
"start", G_TYPE_BOOLEAN, FALSE, NULL);
break;
case RTP_DTMF_EVENT_TYPE_PAUSE_TASK:
return;
}
if (s)
gst_element_post_message (GST_ELEMENT (dtmfsrc),
gst_message_new_element (GST_OBJECT (dtmfsrc), s));
}
static GstFlowReturn
gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
guint length, GstBuffer ** buffer)
@ -668,6 +715,7 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
case RTP_DTMF_EVENT_TYPE_STOP:
GST_WARNING_OBJECT (dtmfsrc,
"Received a DTMF stop event when already stopped");
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
break;
case RTP_DTMF_EVENT_TYPE_START:
@ -678,6 +726,7 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
if (!gst_rtp_dtmf_prepare_timestamps (dtmfsrc))
goto no_clock;
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-processed", event);
dtmfsrc->payload = event->payload;
event->payload = NULL;
break;
@ -711,6 +760,7 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
case RTP_DTMF_EVENT_TYPE_START:
GST_WARNING_OBJECT (dtmfsrc,
"Received two consecutive DTMF start events");
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
break;
case RTP_DTMF_EVENT_TYPE_STOP:
@ -718,6 +768,7 @@ gst_rtp_dtmf_src_create (GstBaseSrc * basesrc, guint64 offset,
dtmfsrc->last_packet = TRUE;
/* Set the redundancy on the last packet */
dtmfsrc->redundancy_count = dtmfsrc->packet_redundancy;
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-processed", event);
break;
case RTP_DTMF_EVENT_TYPE_PAUSE_TASK:
@ -1004,8 +1055,11 @@ gst_rtp_dtmf_src_change_state (GstElement * element, GstStateChange transition)
gst_rtp_dtmf_src_ready_to_paused (dtmfsrc);
/* Flushing the event queue */
while ((event = g_async_queue_try_pop (dtmfsrc->event_queue)) != NULL)
while ((event = g_async_queue_try_pop (dtmfsrc->event_queue)) != NULL) {
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
gst_rtp_dtmf_src_event_free (event);
}
dtmfsrc->last_event_was_start = FALSE;
no_preroll = TRUE;
break;
@ -1025,8 +1079,11 @@ gst_rtp_dtmf_src_change_state (GstElement * element, GstStateChange transition)
case GST_STATE_CHANGE_PAUSED_TO_READY:
/* Flushing the event queue */
while ((event = g_async_queue_try_pop (dtmfsrc->event_queue)) != NULL)
while ((event = g_async_queue_try_pop (dtmfsrc->event_queue)) != NULL) {
gst_dtmf_src_post_message (dtmfsrc, "dtmf-event-dropped", event);
gst_rtp_dtmf_src_event_free (event);
}
dtmfsrc->last_event_was_start = FALSE;
/* Indicate that we don't do PRE_ROLL */
break;

View file

@ -93,6 +93,7 @@ struct _GstRTPDTMFSrc
guint16 ptime;
guint16 packet_redundancy;
guint32 clock_rate;
gboolean last_event_was_start;
GstClockTime last_stop;

View file

@ -168,7 +168,7 @@ gst_pes_filter_parse (GstPESFilter * filter)
avail = MIN (avail, filter->length + 6);
}
if (avail < 7)
if (avail < 6)
goto need_more_data;
/* read more data, either the whole packet if there is a length
@ -202,6 +202,8 @@ gst_pes_filter_parse (GstPESFilter * filter)
break;
}
if (datalen == 0)
goto need_more_data;
filter->pts = filter->dts = -1;
/* stuffing bits, first two bits are '10' for mpeg2 pes so this code is

View file

@ -2197,6 +2197,12 @@ mpegts_packetizer_push_section (MpegTSPacketizer * packetizer,
if (packet->pid == 0x14) {
table_id = data[0];
section->section_length = GST_READ_UINT24_BE (data) & 0x000FFF;
if (data - GST_BUFFER_DATA (packet->buffer) + section->section_length + 3 >
GST_BUFFER_SIZE (packet->buffer)) {
GST_WARNING ("PID %dd PSI section length extends past the end "
"of the buffer", packet->pid);
goto out;
}
section->buffer = gst_buffer_create_sub (packet->buffer,
data - GST_BUFFER_DATA (packet->buffer), section->section_length + 3);
section->table_id = table_id;

View file

@ -379,7 +379,7 @@ setup_wrappercamerabinsrc_videotestsrc (void)
g_object_set (G_OBJECT (audiosrc), "is-live", TRUE, NULL);
g_object_set (G_OBJECT (src), "video-source", testsrc, NULL);
g_object_set (G_OBJECT (camera), "camera-source", src, "preview-caps",
preview_caps, "audio-source", audiosrc, NULL);
preview_caps, "post-previews", TRUE, "audio-source", audiosrc, NULL);
gst_object_unref (src);
gst_object_unref (testsrc);
gst_object_unref (audiosrc);

View file

@ -23,7 +23,7 @@
#include <gst/codecparsers/gstmpegvideoparser.h>
/* actually seq + gop */
static guint8 mpeg2_seq[] = {
static const guint8 mpeg2_seq[] = {
0x00, 0x00, 0x01, 0xb3, 0x02, 0x00, 0x18, 0x15, 0xff, 0xff, 0xe0, 0x28,
0x00, 0x00, 0x01, 0xb3, 0x78, 0x04, 0x38, 0x37, 0xff, 0xff, 0xf0, 0x00,
0x00, 0x00, 0x01, 0xb5, 0x14, 0x8a, 0x00, 0x11, 0x03, 0x71,
@ -31,7 +31,7 @@ static guint8 mpeg2_seq[] = {
0x00, 0x00, 0x01, 0x03, 0x00, 0x08, 0x00, 0x00
};
static guint8 mis_identified_datas[] = {
static const guint8 mis_identified_datas[] = {
0x00, 0x00, 0x01, 0x1f, 0x4a, 0xf4, 0xd4, 0xd8, 0x08, 0x23, 0xdd,
0x7c, 0xd3, 0x75, 0x21, 0x43, 0x85, 0x31, 0x43, 0x04, 0x24, 0x30,
0x18, 0x43, 0xba, 0x1a, 0x50, 0x60, 0xbb, 0x53, 0x56, 0x80, 0x41,
@ -85,7 +85,8 @@ GST_START_TEST (test_mpeg_parse)
assert_equals_int (ordercode[i], typeoffsz->type);
}
g_list_free_full (list, (GDestroyNotify) g_free);
g_list_foreach (list, (GFunc) g_free, NULL);
g_list_free (list);
}
GST_END_TEST;
@ -115,7 +116,8 @@ GST_START_TEST (test_mpeg_parse_sequence_header)
assert_equals_int (seqhdr.vbv_buffer_size_value, 512);
fail_unless (seqhdr.constrained_parameters_flag == FALSE);
g_list_free_full (list, (GDestroyNotify) g_free);
g_list_foreach (list, (GFunc) g_free, NULL);
g_list_free (list);
}
GST_END_TEST;
@ -145,7 +147,8 @@ GST_START_TEST (test_mpeg_parse_sequence_extension)
assert_equals_int (seqext.fps_n_ext, 3);
assert_equals_int (seqext.fps_d_ext, 2);
g_list_free_full (list, (GDestroyNotify) g_free);
g_list_foreach (list, (GFunc) g_free, NULL);
g_list_free (list);
}
GST_END_TEST;
@ -154,7 +157,7 @@ GST_START_TEST (test_mis_identified_datas)
{
GList *list, *tmp;
GstMpegVideoTypeOffsetSize *typeoffsz;
guint8 *data = mis_identified_datas;
const guint8 *data = mis_identified_datas;
list = gst_mpeg_video_parse (mis_identified_datas,
sizeof (mis_identified_datas), 0);
@ -168,7 +171,8 @@ GST_START_TEST (test_mis_identified_datas)
assert_equals_int (data[typeoffsz->offset - 2], 1);
}
g_list_free_full (list, (GDestroyNotify) g_free);
g_list_foreach (list, (GFunc) g_free, NULL);
g_list_free (list);
}
GST_END_TEST;