Skip to content

Commit

Permalink
Event handling on dtsdownmix implemented
Browse files Browse the repository at this point in the history
 Now the event handling is ok for sink and src by dtsdownmix.
 I added special commented line to be able to monitor event occurence.
 Those who want to help in developpemnt can uncomment them.
 Based on that and hopefully a couple if ideas from other devellopers,
 We can solve sync delay issues on Dreambox.
 A hint as for how to also show those printf in enigma2 log verry welcome.

 Changes:
	modified:   gstdtsdownmix.c
	modified:   gstdvbaudiosink.c
  • Loading branch information
christophecvr committed Apr 3, 2015
1 parent 60b8997 commit 1401dfc
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 49 deletions.
31 changes: 15 additions & 16 deletions gstdtsdownmix.c
Expand Up @@ -143,7 +143,7 @@ gst_dtsdec_class_init (GstDtsDecClass * klass)
gstbase_class->start = GST_DEBUG_FUNCPTR (gst_dtsdec_start);
gstbase_class->stop = GST_DEBUG_FUNCPTR (gst_dtsdec_stop);
gstbase_class->src_event = GST_DEBUG_FUNCPTR(gst_dtsdec_src_event);
// gstbase_class->sink_event = GST_DEBUG_FUNCPTR(gst_dtsdec_sink_event); // does not work can't find why it blocks when it is used
gstbase_class->sink_event = GST_DEBUG_FUNCPTR(gst_dtsdec_sink_event);
gstbase_class->set_format = GST_DEBUG_FUNCPTR (gst_dtsdec_set_format);
gstbase_class->parse = GST_DEBUG_FUNCPTR (gst_dtsdec_parse);
gstbase_class->handle_frame = GST_DEBUG_FUNCPTR (gst_dtsdec_handle_frame);
Expand Down Expand Up @@ -661,7 +661,7 @@ gst_dtsdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
goto bad_first_access_parameter;

subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset, len);
GST_BUFFER_TIMESTAMP (subbuf) = GST_CLOCK_TIME_NONE;
GST_BUFFER_DTS (subbuf) = GST_CLOCK_TIME_NONE;
ret = dts->base_chain (pad, parent, subbuf);
if (ret != GST_FLOW_OK) {
gst_buffer_unref (buf);
Expand All @@ -673,7 +673,7 @@ gst_dtsdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)

if (len > 0) {
subbuf = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset, len);
GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf);
GST_BUFFER_DTS (subbuf) = GST_BUFFER_PTS (buf);

ret = dts->base_chain (pad, parent, subbuf);
}
Expand All @@ -683,7 +683,7 @@ gst_dtsdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
subbuf =
gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL, offset,
size - offset);
GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf);
GST_BUFFER_DTS (subbuf) = GST_BUFFER_PTS (buf);
ret = dts->base_chain (pad, parent, subbuf);
gst_buffer_unref (buf);
}
Expand Down Expand Up @@ -748,20 +748,19 @@ static gboolean gst_dtsdec_sink_event(GstAudioDecoder * dec , GstEvent * sink_ev
GstDtsDec *dts = GST_DTSDEC (dec);
GstDtsDecClass *klass;
gboolean ret = TRUE;
klass = GST_DTSDEC_CLASS (G_OBJECT_GET_CLASS (dts));
GST_LOG_OBJECT(dts, "%s event", GST_EVENT_TYPE_NAME(sink_event));
klass = GST_DTSDEC_CLASS (G_OBJECT_GET_CLASS (dts));
/* TO MONITOR EVENT PROCESS REMOVE THE COMMENTED(//) ON LINE BELOW */
// printf("A SINK EVENT name %s just occured\n", GST_EVENT_TYPE_NAME(sink_event));
switch (GST_EVENT_TYPE (sink_event))
{
// case GST_EVENT_TAG:
// gst_event_unref (sink_event);
// break;
case GST_EVENT_TAG:
ret = gst_pad_push_event (GST_AUDIO_DECODER_SRC_PAD (dts), sink_event);
break;
default :
ret = TRUE;
// gst_event_unref (sink_event);
ret = gst_pad_push_event (GST_AUDIO_DECODER_SRC_PAD (dts), sink_event);
break;
}
gst_event_unref (sink_event);
return ret;
}

Expand All @@ -774,20 +773,20 @@ static gboolean gst_dtsdec_src_event(GstAudioDecoder * dec , GstEvent * src_even
gboolean ret = TRUE;
GST_LOG_OBJECT(dts, "%s event", GST_EVENT_TYPE_NAME(src_event));
klass = GST_DTSDEC_CLASS (G_OBJECT_GET_CLASS (dts));
/* TO MONITOR EVENT PROCESS REMOVE THE COMMENTED(//) ON LINE BELOW */
// printf("A SRC EVENT NAME = <%s> JUST OCCORED\n", GST_EVENT_TYPE_NAME(src_event));
switch (GST_EVENT_TYPE (src_event))
{
case GST_EVENT_LATENCY:
{
gst_event_parse_latency (src_event, &latency);
gst_event_copy (src_event);
latency = 1;
GstEvent * gst_event_new_latency (GstClockTime latency);
ret = gst_pad_push_event (GST_AUDIO_DECODER_SINK_PAD (dts), src_event);
}
break;
default:
ret = gst_pad_push_event (GST_AUDIO_DECODER_SINK_PAD (dts), src_event);
break;
}
gst_event_unref (src_event);
return ret;
}

Expand All @@ -808,7 +807,7 @@ static GstStateChangeReturn gst_dtsdec_change_state(GstElement * element, GstSta
{
GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
GstDtsDec *dts = GST_DTSDEC(element);
printf("STATE CHANGE OCCURED TYPE = %d\n", transition);
// printf("STATE CHANGE OCCURED TYPE = %d\n", transition);

switch (transition)
{
Expand Down
48 changes: 15 additions & 33 deletions gstdvbaudiosink.c
Expand Up @@ -267,26 +267,6 @@ static gint64 gst_dvbaudiosink_get_decoder_time(GstDVBAudioSink *self)
gint64 cur = 0;
if (self->fd < 0 || !self->playing || !self->pts_written) return GST_CLOCK_TIME_NONE;

#ifdef DREAMBOX
if (self->pts_written)
{
ioctl(self->fd, AUDIO_GET_PTS, &cur);
if (cur)
{
self->lastpts = cur;
}
else
{
cur = self->lastpts;
}
cur *= 11111;
cur -= self->timestamp_offset;
}
else
{
cur = 0;
}
#else
ioctl(self->fd, AUDIO_GET_PTS, &cur);
if (cur)
{
Expand All @@ -297,10 +277,8 @@ static gint64 gst_dvbaudiosink_get_decoder_time(GstDVBAudioSink *self)
cur = self->lastpts;
}
cur *= 11111;
cur -= self->timestamp_offset;
#endif

return cur;
return cur - self->timestamp_offset;
}

static gboolean gst_dvbaudiosink_unlock(GstBaseSink *basesink)
Expand Down Expand Up @@ -783,13 +761,16 @@ static gboolean gst_dvbaudiosink_event(GstBaseSink *sink, GstEvent *event)
end = segment->stop;
pos = segment->position;

GST_DEBUG_OBJECT(self, "GST_EVENT_NEWSEGMENT rate=%f %d\n", rate, format);

GST_DEBUG_OBJECT(self, "GST_EVENT_SEGMENT rate=%f %d\n", rate, format);

// printf("DO WE USE GST_EVENT_SEGMENT rate = %f format = %d\n", rate, format);
if (format == GST_FORMAT_TIME)
{
// printf("IS FORMAT AQUAL TO GST_FORMAT_TIME ?\n");
self->timestamp_offset = start - pos;
if (rate != self->rate)
{
// printf("IS FORMAT AQUAL TO GST_FORMAT_TIME ?\n");
int video_fd = open("/dev/dvb/adapter0/video0", O_RDWR);
if (video_fd >= 0)
{
Expand Down Expand Up @@ -819,20 +800,21 @@ static gboolean gst_dvbaudiosink_event(GstBaseSink *sink, GstEvent *event)
gst_event_parse_caps(event, &caps);
if (caps)
{
// printf("DO WE HAVE CAPS ?\n");
ret = gst_dvbaudiosink_set_caps(sink, caps);
gst_caps_unref(caps);
if (ret != TRUE)
{
// printf("DID WE SET CAPS ?\n");
//GST_ELEMENT_ERROR(self, STREAM, FORMAT,(NULL), ("Set caps failed. Stop render."));
}
}
break;
}

default:
ret = GST_BASE_SINK_CLASS(parent_class)->event(sink, event);
break;
}

return ret;
}

Expand Down Expand Up @@ -985,7 +967,7 @@ GstFlowReturn gst_dvbaudiosink_push_buffer(GstDVBAudioSink *self, GstBuffer *buf
*/
if (timestamp == GST_CLOCK_TIME_NONE)
{
timestamp = GST_BUFFER_PTS(buffer);
timestamp = GST_BUFFER_TIMESTAMP(buffer);
if (timestamp != GST_CLOCK_TIME_NONE && duration != GST_CLOCK_TIME_NONE)
{
self->timestamp = timestamp + duration;
Expand All @@ -999,7 +981,7 @@ GstFlowReturn gst_dvbaudiosink_push_buffer(GstDVBAudioSink *self, GstBuffer *buf
}
else
{
timestamp = GST_BUFFER_PTS(buffer);
timestamp = GST_BUFFER_TIMESTAMP(buffer);
self->timestamp = GST_CLOCK_TIME_NONE;
}
}
Expand Down Expand Up @@ -1157,7 +1139,7 @@ static GstFlowReturn gst_dvbaudiosink_render(GstBaseSink *sink, GstBuffer *buffe
GstClockTime duration = GST_BUFFER_DURATION(buffer);
gsize buffersize;
buffersize = gst_buffer_get_size(buffer);
GstClockTime timestamp = GST_BUFFER_PTS(buffer);
GstClockTime timestamp = GST_BUFFER_TIMESTAMP(buffer);

if (self->bypass <= AUDIOTYPE_UNKNOWN)
{
Expand Down Expand Up @@ -1186,7 +1168,7 @@ static GstFlowReturn gst_dvbaudiosink_render(GstBaseSink *sink, GstBuffer *buffe
{
GstBuffer *newbuffer;
newbuffer = gst_buffer_copy_region(buffer, GST_BUFFER_COPY_ALL, self->skip, buffersize - self->skip);
GST_BUFFER_PTS(newbuffer) = timestamp;
GST_BUFFER_TIMESTAMP(newbuffer) = timestamp;
GST_BUFFER_DURATION(newbuffer) = duration;
if (disposebuffer) gst_buffer_unref(disposebuffer);
buffer = disposebuffer = newbuffer;
Expand All @@ -1198,7 +1180,7 @@ static GstFlowReturn gst_dvbaudiosink_render(GstBaseSink *sink, GstBuffer *buffe
/* join unrefs both buffers */
buffer = gst_buffer_append(self->cache, buffer);
buffersize = gst_buffer_get_size(buffer);
GST_BUFFER_PTS(buffer) = timestamp;
GST_BUFFER_TIMESTAMP(buffer) = timestamp;
GST_BUFFER_DURATION(buffer) = duration;
disposebuffer = buffer;
self->cache = NULL;
Expand All @@ -1225,7 +1207,7 @@ static GstFlowReturn gst_dvbaudiosink_render(GstBaseSink *sink, GstBuffer *buffe
GstBuffer *block;
block = gst_buffer_copy_region(buffer, GST_BUFFER_COPY_ALL, index, self->fixed_buffersize);
/* only the first buffer needs the correct timestamp, next buffer timestamps will be ignored (and extrapolated) */
GST_BUFFER_PTS(block) = self->fixed_buffertimestamp;
GST_BUFFER_TIMESTAMP(block) = self->fixed_buffertimestamp;
GST_BUFFER_DURATION(block) = self->fixed_bufferduration;
self->fixed_buffertimestamp += self->fixed_bufferduration;
gst_dvbaudiosink_push_buffer(self, block);
Expand Down

0 comments on commit 1401dfc

Please sign in to comment.