Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 22 additions & 21 deletions middleware/InterfacePlayerRDK.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -3881,13 +3881,13 @@ bool gst_StartsWith( const char *inputStr, const char *prefix )
* @param[in] pInterfacePlayerRDK pointer to InterfacePlayerRDK instance
* @retval TRUE if element name is that of audio or video decoder
*/
bool GstPlayer_isVideoOrAudioDecoder(const char *name, InterfacePlayerRDK *pInterfacePlayerRDK)
bool GstPlayer_isVideoOrAudioDecoder(const char *name, InterfacePlayerRDK *pInterfacePlayerRDK, GstElement* element)
{
// The idea is to identify video or audio decoder plugin created at runtime by playbin and register to its first-frame/pts-error callbacks
// This support is available in plugins in RDK builds and hence checking only for such plugin instances here
// For platforms that doesnt support callback, we use GST_STATE_PLAYING state change of playbin to notify first frame to app
InterfacePlayerPriv* privatePlayer = pInterfacePlayerRDK->GetPrivatePlayer();
return privatePlayer->socInterface->IsAudioOrVideoDecoder(name);
return privatePlayer->socInterface->IsAudioOrVideoDecoder(name, element);
}

/**
Expand All @@ -3896,10 +3896,10 @@ bool GstPlayer_isVideoOrAudioDecoder(const char *name, InterfacePlayerRDK *pInte
* @param[in] pInterfacePlayerRDK pointer to InterfacePlayerRDK instance
* @retval TRUE if element name is that of the decoder
*/
bool GstPlayer_isVideoDecoder(const char* name, InterfacePlayerRDK * pInterfacePlayerRDK)
bool GstPlayer_isVideoDecoder(const char* name, InterfacePlayerRDK * pInterfacePlayerRDK, GstElement* element)
{
InterfacePlayerPriv* privatePlayer = pInterfacePlayerRDK->GetPrivatePlayer();
return privatePlayer->socInterface->IsVideoDecoder(name);
return privatePlayer->socInterface->IsVideoDecoder(name, element);
}

/**
Expand Down Expand Up @@ -3954,10 +3954,10 @@ static GstPadProbeReturn GstPlayer_HandleInstantRateChangeSeekProbe(GstPad* pad,
* @param[in] pInterfacePlayerRDK pointer to INterfacePlayerRDK instance
* @retval TRUE if element name is that of video sink
*/
bool GstPlayer_isVideoSink(const char* name, InterfacePlayerRDK* pInterfacePlayerRDK)
bool GstPlayer_isVideoSink(const char* name, InterfacePlayerRDK* pInterfacePlayerRDK, GstElement* element)
{
InterfacePlayerPriv* privatePlayer = pInterfacePlayerRDK->GetPrivatePlayer();
return privatePlayer->socInterface->IsVideoSink(name);
return privatePlayer->socInterface->IsVideoSink(name,element);
}

/**
Expand Down Expand Up @@ -4061,7 +4061,7 @@ static gboolean VideoDecoderPtsCheckerForEOS(gpointer user_data)
* @param[in] pInterfacePlayerRDK pointer to InterfacePlayerRDK instance
* @retval TRUE if element name is that of audio sink or audio decoder
*/
bool GstPlayer_isAudioSinkOrAudioDecoder(const char* name, InterfacePlayerRDK * pInterfacePlayerRDK)
bool GstPlayer_isAudioSinkOrAudioDecoder(const char* name, InterfacePlayerRDK * pInterfacePlayerRDK, GstElement* element)
{
InterfacePlayerPriv* privatePlayer = pInterfacePlayerRDK->GetPrivatePlayer();
return privatePlayer->socInterface->IsAudioSinkOrAudioDecoder(name);
Expand Down Expand Up @@ -4092,18 +4092,18 @@ static void GstPlayer_OnGstBufferUnderflowCb(GstElement* object, guint arg0, gpo

if (privatePlayer->socInterface->IsVideoSinkHandleErrors())
{
isVideo = GstPlayer_isVideoSink(GST_ELEMENT_NAME(object), pInterfacePlayerRDK);
isVideo = GstPlayer_isVideoSink(GST_ELEMENT_NAME(object), pInterfacePlayerRDK, object);
}
else
{
isVideo = GstPlayer_isVideoDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK);
isVideo = GstPlayer_isVideoDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK,object);
}

if (isVideo)
{
type = eGST_MEDIATYPE_VIDEO;
}
else if (GstPlayer_isAudioSinkOrAudioDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK))
else if (GstPlayer_isAudioSinkOrAudioDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK,object))
{
type = eGST_MEDIATYPE_AUDIO;
}
Expand Down Expand Up @@ -4164,13 +4164,13 @@ static void GstPlayer_OnGstPtsErrorCb(GstElement *object, guint arg0, gpointer a
bool isAudioSink = false;
if (privatePlayer->socInterface->IsVideoSinkHandleErrors())
{
isVideo = GstPlayer_isVideoSink(GST_ELEMENT_NAME(object), pInterfacePlayerRDK);
isVideo = GstPlayer_isVideoSink(GST_ELEMENT_NAME(object), pInterfacePlayerRDK, object);
}
else
{
isVideo = GstPlayer_isVideoDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK);
isVideo = GstPlayer_isVideoDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK,object);
}
if (GstPlayer_isAudioSinkOrAudioDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK))
if (GstPlayer_isAudioSinkOrAudioDecoder(GST_ELEMENT_NAME(object), pInterfacePlayerRDK,object))
{
isAudioSink = true;
}
Expand Down Expand Up @@ -4378,11 +4378,11 @@ static gboolean bus_message(GstBus * bus, GstMessage * msg, InterfacePlayerRDK *
}
}
//this code should be handled as part of IARM modification
if ((NULL != msg->src) && GstPlayer_isVideoOrAudioDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK))
if ((NULL != msg->src) && GstPlayer_isVideoOrAudioDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement *)msg->src))
{
// This is the video decoder, send this to the output protection module
// so it can get the source width/height
if (GstPlayer_isVideoDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK))
if (GstPlayer_isVideoDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement *)msg->src))
{
if(PlayerExternalsInterface::IsPlayerExternalsInterfaceInstanceActive())
{
Expand Down Expand Up @@ -4412,15 +4412,15 @@ static gboolean bus_message(GstBus * bus, GstMessage * msg, InterfacePlayerRDK *
}

}
if((NULL != msg->src) && ((privatePlayer->socInterface->IsVideoSinkHandleErrors() && GstPlayer_isVideoSink(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK)) || (!privatePlayer->socInterface->IsVideoSinkHandleErrors() && GstPlayer_isVideoOrAudioDecoder(GST_OBJECT_NAME(msg->src),pInterfacePlayerRDK))) && (!privatePlayer->gstPrivateContext->usingRialtoSink))
if((NULL != msg->src) && ((privatePlayer->socInterface->IsVideoSinkHandleErrors() && GstPlayer_isVideoSink(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement *)msg->src)) || (!privatePlayer->socInterface->IsVideoSinkHandleErrors() && GstPlayer_isVideoOrAudioDecoder(GST_OBJECT_NAME(msg->src),pInterfacePlayerRDK, (GstElement *)msg->src))) && (!privatePlayer->gstPrivateContext->usingRialtoSink))
{
if (old_state == GST_STATE_NULL && new_state == GST_STATE_READY)
{
privatePlayer->SignalConnect(msg->src, "buffer-underflow-callback",
G_CALLBACK(GstPlayer_OnGstBufferUnderflowCb), pInterfacePlayerRDK);
privatePlayer->SignalConnect(msg->src, "pts-error-callback",
G_CALLBACK(GstPlayer_OnGstPtsErrorCb), pInterfacePlayerRDK);
if (!privatePlayer->socInterface->IsVideoSinkHandleErrors() && GstPlayer_isVideoDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK))
if (!privatePlayer->socInterface->IsVideoSinkHandleErrors() && GstPlayer_isVideoDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement *)msg->src))
{
privatePlayer->SignalConnect(msg->src, "decode-error-callback",
G_CALLBACK(GstPlayer_OnGstDecodeErrorCb), pInterfacePlayerRDK);
Expand Down Expand Up @@ -4815,7 +4815,7 @@ static GstBusSyncReply bus_sync_handler(GstBus * bus, GstMessage * msg, Interfac
*/
if (new_state == GST_STATE_PAUSED && old_state == GST_STATE_READY)
{
if (GstPlayer_isVideoSink(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK))
if (GstPlayer_isVideoSink(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement*) msg->src))
{ // video scaling patch
/*
brcmvideosink doesn't sets the rectangle property correct by default
Expand Down Expand Up @@ -4875,9 +4875,9 @@ static GstBusSyncReply bus_sync_handler(GstBus * bus, GstMessage * msg, Interfac
}
if (old_state == GST_STATE_NULL && new_state == GST_STATE_READY)
{
if ((NULL != msg->src) && GstPlayer_isVideoOrAudioDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK))
if ((NULL != msg->src) && GstPlayer_isVideoOrAudioDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement*) msg->src))
{
if (GstPlayer_isVideoDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK))
if (GstPlayer_isVideoDecoder(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement *)msg->src))
{ // video
gst_object_replace((GstObject **)&privatePlayer->gstPrivateContext->video_dec, msg->src);
type_check_instance("bus_sync_handle: video_dec ", privatePlayer->gstPrivateContext->video_dec);
Expand All @@ -4903,7 +4903,7 @@ static GstBusSyncReply bus_sync_handler(GstBus * bus, GstMessage * msg, Interfac

}
}
if ((NULL != msg->src) && GstPlayer_isVideoSink(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK) && (!privatePlayer->gstPrivateContext->usingRialtoSink))
if ((NULL != msg->src) && GstPlayer_isVideoSink(GST_OBJECT_NAME(msg->src), pInterfacePlayerRDK, (GstElement*) msg->src) && (!privatePlayer->gstPrivateContext->usingRialtoSink))
{
if(privatePlayer->gstPrivateContext->enableSEITimeCode)
{
Expand Down Expand Up @@ -5347,3 +5347,4 @@ double InterfacePlayerRDK::FlushTrack(int mediaType, double pos, double audioDel

return rate;
}

Empty file modified middleware/InterfacePlayerRDK.h
100644 → 100755
Empty file.
Empty file modified middleware/vendor/SocInterface.cpp
100644 → 100755
Empty file.
6 changes: 3 additions & 3 deletions middleware/vendor/SocInterface.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ class SocInterface
* @param name Element name.
* @return True if it's a video sink, false otherwise.
*/
virtual bool IsVideoSink(const char* name) = 0;
virtual bool IsVideoSink(const char* name, GstElement *element = nullptr) = 0;

/**
* @brief Check if the given name is an audio sink or audio decoder.
Expand All @@ -310,7 +310,7 @@ class SocInterface
* @param name Element name.
* @return True if it's a video decoder, false otherwise.
*/
virtual bool IsVideoDecoder(const char* name) = 0;
virtual bool IsVideoDecoder(const char* name, GstElement* element = nullptr) = 0;

/**
* @brief Configure the audio sink.
Expand All @@ -326,7 +326,7 @@ class SocInterface
* @param name Element name
* @return True if it's an audio or video decoder, false otherwise.
*/
virtual bool IsAudioOrVideoDecoder(const char* name) = 0;
virtual bool IsAudioOrVideoDecoder(const char* name, GstElement* element = nullptr) = 0;

/**
* @brief Disable asynchronous audio.
Expand Down
54 changes: 51 additions & 3 deletions middleware/vendor/amlogic/AmlogicSocInterface.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,29 @@ void AmlogicSocInterface::SetAC4Tracks(GstElement *src, int trackId)
* @param name Element name.
* @return True if it's a video sink, false otherwise.
*/
bool AmlogicSocInterface::IsVideoSink(const char* name)

/*bool AmlogicSocInterface::IsVideoSink(const char* name)
{
return name && StartsWith(name, "westerossink");
}
*/
bool AmlogicSocInterface::IsVideoSink(const char* name, GstElement *element)
{
// First check if it's a sink at all
if (!GST_OBJECT_FLAG_IS_SET(element, GST_ELEMENT_FLAG_SINK)) {
return FALSE;
}

// Get element factory and check class metadata
GstElementFactory *factory = gst_element_get_factory(element);
if (!factory) return FALSE;

const gchar *klass = gst_element_factory_get_metadata(factory, GST_ELEMENT_METADATA_KLASS);
if (!klass) return FALSE;

// Video sinks have both "Sink" and "Video" in their klass
return (strstr(klass, "Sink") != NULL && strstr(klass, "Video") != NULL);
}

/**
* @brief Get SVP Context
Expand Down Expand Up @@ -203,10 +222,24 @@ bool AmlogicSocInterface::IsAudioSinkOrAudioDecoder(const char* name)
* @param isWesteros Westeros flag.
* @return True if it's a video decoder, false otherwise.
*/
bool AmlogicSocInterface::IsVideoDecoder(const char* name)
/*bool AmlogicSocInterface::IsVideoDecoder(const char* name)
{
return name && StartsWith(name, "westerossink");
}
*/
bool AmlogicSocInterface::IsVideoDecoder(const char* name, GstElement* element)
{
// Get element factory
GstElementFactory *factory = gst_element_get_factory(element);
if (!factory) return FALSE;

// Get class metadata
const gchar *klass = gst_element_factory_get_metadata(factory, GST_ELEMENT_METADATA_KLASS);
if (!klass) return FALSE;

return (strstr(klass, "Decoder") != NULL) ||
(strstr(klass, "Sink") != NULL && strstr(klass, "Video") != NULL);
}

/**
* @brief Configure the audio sink.
Expand Down Expand Up @@ -243,10 +276,25 @@ bool AmlogicSocInterface::ConfigureAudioSink(GstElement **audio_sink, GstObject
* @param IsWesteros Westeros flag.
* @return True if it's an audio or video decoder, false otherwise.
*/
bool AmlogicSocInterface::IsAudioOrVideoDecoder(const char* name)
/*bool AmlogicSocInterface::IsAudioOrVideoDecoder(const char* name)
{
return name && StartsWith(name, "westerossink");
}
*/
bool AmlogicSocInterface::IsAudioOrVideoDecoder(const char* name, GstElement* element)
{
// Get element factory
GstElementFactory *factory = gst_element_get_factory(element);
if (!factory) return FALSE;

// Get class metadata
const gchar *klass = gst_element_factory_get_metadata(factory, GST_ELEMENT_METADATA_KLASS);
if (!klass) return FALSE;

// Any decoder (audio or video) will have "Decoder" in its klass
return (strstr(klass, "Decoder") != NULL) ||
(strstr(klass, "Sink") != NULL && strstr(klass, "Video") != NULL);
}

/**
* @brief Set playback flags.
Expand Down
8 changes: 5 additions & 3 deletions middleware/vendor/amlogic/AmlogicSocInterface.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,8 @@ class AmlogicSocInterface : public SocInterface
* @param name Element name.
* @return True if it's a video sink, false otherwise.
*/
bool IsVideoSink(const char* name)override;

bool IsVideoSink(const char* name, GstElement *element)override;

/**
* @brief Check if the given name is an audio sink or audio decoder.
Expand All @@ -147,7 +148,7 @@ class AmlogicSocInterface : public SocInterface
* @param name Element name.
* @return True if it's a video decoder, false otherwise.
*/
bool IsVideoDecoder(const char* name)override;
bool IsVideoDecoder(const char* name, GstElement* element)override;

/**
* @brief Configure the audio sink.
Expand All @@ -164,7 +165,8 @@ class AmlogicSocInterface : public SocInterface
* @param IsWesteros Westeros flag.
* @return True if it's an audio or video decoder, false otherwise.
*/
bool IsAudioOrVideoDecoder(const char* name)override;

bool IsAudioOrVideoDecoder(const char* name, GstElement* element)override;

/**
* @brief Retrieves the CC decoder handle.
Expand Down
6 changes: 3 additions & 3 deletions middleware/vendor/brcm/BrcmSocInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ GstElement* BrcmSocInterface::GetVideoSink(GstElement* sinkbin)
* @param name Element name.
* @return True if it's a video sink, false otherwise.
*/
bool BrcmSocInterface::IsVideoSink(const char* name)
bool BrcmSocInterface::IsVideoSink(const char* name, GstElement* element)
{
return name && (
StartsWith(name, "brcmvideosink") ||
Expand All @@ -139,7 +139,7 @@ bool BrcmSocInterface::IsAudioSinkOrAudioDecoder(const char* name)
* @param name Element name.
* @return True if it's a video decoder, false otherwise.
*/
bool BrcmSocInterface::IsVideoDecoder(const char* name)
bool BrcmSocInterface::IsVideoDecoder(const char* name, GstElement* element)
{
return name && (
StartsWith(name, "westerossink") ||
Expand Down Expand Up @@ -175,7 +175,7 @@ bool BrcmSocInterface::ConfigureAudioSink(GstElement **audio_sink, GstObject *sr
* @param IsWesteros Westeros flag.
* @return True if it's an audio or video decoder, false otherwise.
*/
bool BrcmSocInterface::IsAudioOrVideoDecoder(const char* name)
bool BrcmSocInterface::IsAudioOrVideoDecoder(const char* name, GstElement* element)
{
return name && (
StartsWith(name, "brcmvideodecoder") ||
Expand Down
6 changes: 3 additions & 3 deletions middleware/vendor/brcm/BrcmSocInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class BrcmSocInterface : public SocInterface
* @param name Element name.
* @return True if it's a video sink, false otherwise.
*/
bool IsVideoSink(const char* name)override;
bool IsVideoSink(const char* name, GstElement *element)override;

/**
* @brief Check if the given name is an audio sink or audio decoder.
Expand All @@ -105,7 +105,7 @@ class BrcmSocInterface : public SocInterface
* @param name Element name.
* @return True if it's a video decoder, false otherwise.
*/
bool IsVideoDecoder(const char* name)override;
bool IsVideoDecoder(const char* name, GstElement *element)override;

/**
* @brief Configure the audio sink.
Expand All @@ -122,7 +122,7 @@ class BrcmSocInterface : public SocInterface
* @param IsWesteros Westeros flag.
* @return True if it's an audio or video decoder, false otherwise.
*/
bool IsAudioOrVideoDecoder(const char* name) override;
bool IsAudioOrVideoDecoder(const char* name, GstElement* element) override;

/**
* @brief Set playback flags.
Expand Down
6 changes: 3 additions & 3 deletions middleware/vendor/default/DefaultSocInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ void DefaultSocInterface::SetAC4Tracks(GstElement *src, int trackId)
g_object_set(src, "ac4-presentation-group-index", trackId, NULL);
}

bool DefaultSocInterface::IsVideoSink(const char* name)
bool DefaultSocInterface::IsVideoSink(const char* name, GstElement* element)
{
return name && (
StartsWith(name,"rialtomsevideosink") ||
Expand All @@ -78,7 +78,7 @@ bool DefaultSocInterface::IsVideoSink(const char* name)
* @param name Element name.
* @return True if it's a video decoder, false otherwise.
*/
bool DefaultSocInterface::IsVideoDecoder(const char* name)
bool DefaultSocInterface::IsVideoDecoder(const char* name, GstElement* element)
{
return name && (
StartsWith(name,"rialtomsevideosink") ||
Expand All @@ -90,7 +90,7 @@ bool DefaultSocInterface::IsVideoDecoder(const char* name)
* @param name Element name.
* @return True if it's an audio or video decoder, false otherwise.
*/
bool DefaultSocInterface::IsAudioOrVideoDecoder(const char* name)
bool DefaultSocInterface::IsAudioOrVideoDecoder(const char* name, GstElement* element)
{
return name && (
StartsWith(name,"rialtomsevideosink") ||
Expand Down
Loading
Loading