#include <mm_message.h>
#include <mm_error.h>
#include <mm_types.h>
+#include <mm_resource_manager.h>
#include "mm_wfd_sink_ini.h"
#include "mm_wfd_sink_attrs.h"
WFD_SINK_M_PIPE = 0, /* NOTE : WFD_SINK_M_PIPE should be zero */
WFD_SINK_M_SRC,
WFD_SINK_M_DEPAY,
+ WFD_SINK_M_QUEUE,
+ WFD_SINK_M_D_VALVE,
WFD_SINK_M_DEMUX,
+ WFD_SINK_M_A_VALVE,
+ WFD_SINK_M_V_VALVE,
WFD_SINK_M_NUM
};
WFD_SINK_A_S_BIN = 0, /* NOTE : WFD_SINK_A_S_BIN should be zero */
WFD_SINK_A_S_RESAMPLER,
WFD_SINK_A_S_VOLUME,
+ WFD_SINK_A_S_QUEUE,
WFD_SINK_A_S_SINK,
WFD_SINK_A_S_NUM
};
WFD_SINK_V_D_QUEUE,
WFD_SINK_V_D_HDCP,
WFD_SINK_V_D_H264_PARSE,
- WFD_SINK_V_D_CAPSSETTER,
WFD_SINK_V_D_H264_DEC,
+ WFD_SINK_V_D_H265_PARSE,
+ WFD_SINK_V_D_H265_DEC,
+ WFD_SINK_V_D_VP9_PARSE,
+ WFD_SINK_V_D_VP9_DEC,
WFD_SINK_V_D_NUM
};
WFD_SINK_MANAGER_CMD_LINK_V_DECODEBIN,
WFD_SINK_MANAGER_CMD_PREPARE_A_PIPELINE,
WFD_SINK_MANAGER_CMD_PREPARE_V_PIPELINE,
+ WFD_SINK_MANAGER_CMD_UNPREPARE_A_PIPELINE,
+ WFD_SINK_MANAGER_CMD_UNPREPARE_V_PIPELINE,
WFD_SINK_MANAGER_CMD_EXIT,
} WFDSinkManagerCMDType;
MM_WFD_SINK_RESOLUTION_MAX = 128,
} MMWFDSinkResolution;
+typedef enum {
+ MM_WFD_SINK_RESOURCE_TYPE_VIDEO_DECODER,
+ MM_WFD_SINK_RESOURCE_TYPE_VIDEO_OVERLAY,
+ MM_WFD_SINK_RESOURCE_TYPE_MAX,
+} MMWFDSinkResourceType;
+
typedef struct {
gint codec;
gint width;
} MMWFDSinkGstElement;
typedef struct {
- MMWFDSinkGstElement *mainbin;
- MMWFDSinkGstElement *a_decodebin;
- MMWFDSinkGstElement *v_decodebin;
- MMWFDSinkGstElement *a_sinkbin;
- MMWFDSinkGstElement *v_sinkbin;
+ MMWFDSinkGstElement *mainbin;
+ MMWFDSinkGstElement *a_decodebin;
+ MMWFDSinkGstElement *v_decodebin;
+ MMWFDSinkGstElement *a_sinkbin;
+ MMWFDSinkGstElement *v_sinkbin;
} MMWFDSinkGstPipelineInfo;
typedef struct {
int(*unprepare)(MMHandleType wfd_sink);
} MMWFDSinkPrivateFunc;
-#define MMWFDSINK_GET_ATTRS(x_wfd) ((x_wfd)? ((mm_wfd_sink_t*)x_wfd)->attrs : (MMHandleType)NULL)
+#define MMWFDSINK_GET_ATTRS(x_wfd) ((x_wfd) ? ((mm_wfd_sink_t*)x_wfd)->attrs : (MMHandleType)NULL)
typedef struct {
/* gstreamer pipeline */
MMWFDSinkGstPipelineInfo *pipeline;
gboolean audio_decodebin_is_linked;
gboolean video_decodebin_is_linked;
+ gulong update_stream_info_sig_id;
+ gulong change_av_format_sig_id;
/* timestamp compensation */
gboolean need_to_reset_basetime;
gboolean manager_thread_exit;
MMWFDSinkPrivateFunc *func_table;
+ MMHandleType extend_handle;
+ guint msg_callback_id;
+
+ guint coupled_sink_status;
+ gchar *coupled_sink_address;
+ gboolean is_coupled_sink_supported;
+
+ /* resource manager for H/W resources */
+ mm_resource_manager_h resource_manager;
+ mm_resource_manager_res_h hw_resource[MM_WFD_SINK_RESOURCE_TYPE_MAX];
+ gboolean interrupted_by_resource;
} mm_wfd_sink_t;
int __mm_wfd_sink_link_audio_decodebin(mm_wfd_sink_t *wfd_sink);
int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink);
-int __mm_wfd_sink_prepare_video_pipeline(mm_wfd_sink_t *wfd_sink);
-int __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_prepare_video_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **sinkpad);
+int __mm_wfd_sink_prepare_audio_pipeline(mm_wfd_sink_t *wfd_sink, GstPad **sinkpad);
+int __mm_wfd_sink_unprepare_audio_pipeline(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_unprepare_video_pipeline(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_activate_audio_stream(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_activate_video_stream(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_deactivate_audio_stream(mm_wfd_sink_t *wfd_sink, gboolean unprepare);
+int __mm_wfd_sink_deactivate_video_stream(mm_wfd_sink_t *wfd_sink, gboolean unprepare);
const gchar *_mm_wfds_sink_get_state_name(MMWFDSinkStateType state);
+int __mm_wfd_sink_check_state(mm_wfd_sink_t *wfd_sink, MMWFDSinkCommandType cmd);
+int __mm_wfd_sink_create_audio_decodebin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_create_video_decodebin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_create_video_sinkbin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_create_audio_sinkbin(mm_wfd_sink_t *wfd_sink);
+void __mm_wfd_sink_print_ref_count(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket, gboolean need_prepare);
+int __mm_wfd_sink_gst_element_link_bucket(GList *element_bucket);
+
+int __mm_wfd_sink_set_pipeline_state(mm_wfd_sink_t *wfd_sink, GstState state, gboolean async);
+int __mm_wfd_sink_create_pipeline(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_destroy_audio_decodebin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_destroy_video_decodebin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_destroy_audio_sinkbin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_destroy_video_sinkbin(mm_wfd_sink_t *wfd_sink);
+int __mm_wfd_sink_destroy_pipeline(mm_wfd_sink_t *wfd_sink);
+
+/* state */
+int __mm_wfd_sink_set_state(mm_wfd_sink_t *wfd_sink, MMWFDSinkStateType state);
#endif
-