GstState oldstate, newstate, pending;
const GstStructure *structure;
- /* we only handle messages from pipeline */
- if (msg->src != (GstObject *)wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst)
- break;
-
/* get state info from msg */
structure = gst_message_get_structure(msg);
if (structure == NULL)
gst_element_state_get_name((GstState)newstate),
gst_element_state_get_name((GstState)pending));
+ /* we only handle messages from pipeline */
+ if (msg->src != (GstObject *)wfd_sink->pipeline->mainbin[WFD_SINK_M_PIPE].gst)
+ break;
+
if (oldstate == newstate) {
wfd_sink_debug("pipeline reports state transition to old state");
break;
MMWFDSINK_POST_MESSAGE(wfd_sink,
MM_ERROR_WFD_INTERNAL,
MMWFDSINK_CURRENT_STATE(wfd_sink));
- } else if (g_strrstr(structure_name, "GstWFDSrcSessionTimeout")) {
+ } else if (g_strrstr(structure_name, "GstWFDSessionTimeout")) {
wfd_sink_error("Got %s, post error message", GST_STR_NULL(structure_name));
MMWFDSINK_POST_MESSAGE(wfd_sink,
MM_ERROR_WFD_INTERNAL,
- MMWFDSINK_CURRENT_STATE(wfd_sink));
+ MM_WFD_SINK_STATE_DISCONNECTED);
}
}
}
return ret;
}
-static int
+int
__mm_wfd_sink_gst_element_add_bucket_to_bin(GstBin *bin, GList *element_bucket, gboolean need_prepare)
{
GList *bucket = element_bucket;
return successful_add_count;
}
-static int
+int
__mm_wfd_sink_gst_element_link_bucket(GList *element_bucket)
{
GList *bucket = element_bucket;
MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_VOLUME].gst, "sink");
MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_VOLUME].gst, "src");
+ MMWFDSINK_CREATE_ELEMENT(a_sinkbin, WFD_SINK_A_S_QUEUE,
+ wfd_sink->ini.name_of_audio_sinkbin_queue, "audio_sinkbin_queue", TRUE);
+ MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_QUEUE].gst, "sink");
+ MMWFDSINK_PAD_PROBE(wfd_sink, NULL, a_sinkbin[WFD_SINK_A_S_QUEUE].gst, "src");
+
/* create sink */
MMWFDSINK_CREATE_ELEMENT(a_sinkbin, WFD_SINK_A_S_SINK,
wfd_sink->ini.name_of_audio_sink, "audio_sink", TRUE);
element_bucket = g_list_append(element_bucket, &v_decodebin[WFD_SINK_V_D_H264_DEC]);
break;
+ case MM_WFD_SINK_VIDEO_CODEC_H265:
+ if (v_decodebin[WFD_SINK_V_D_H265_PARSE].gst)
+ element_bucket = g_list_append(element_bucket, &v_decodebin[WFD_SINK_V_D_H265_PARSE]);
+ if (v_decodebin[WFD_SINK_V_D_H265_DEC].gst)
+ element_bucket = g_list_append(element_bucket, &v_decodebin[WFD_SINK_V_D_H265_DEC]);
+ break;
+
default:
wfd_sink_error("video codec is not decied yet. cannot link video decpdebin...");
return MM_ERROR_WFD_INTERNAL;
}
}
+ if (video_codec & WFD_VIDEO_H265) {
+ /* create parser */
+ MMWFDSINK_CREATE_ELEMENT(v_decodebin, WFD_SINK_V_D_H265_PARSE, wfd_sink->ini.name_of_video_h264_parser, "video_h265_parser", FALSE);
+ MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_H265_PARSE].gst, "sink");
+ MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_H265_PARSE].gst, "src");
+
+ /* create dec */
+ MMWFDSINK_CREATE_ELEMENT(v_decodebin, WFD_SINK_V_D_H265_DEC, wfd_sink->ini.name_of_video_h265_decoder, "video_h265_dec", FALSE);
+ MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_H265_DEC].gst, "sink");
+ MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_H265_DEC].gst, "src");
+ if (v_decodebin[WFD_SINK_V_D_H265_DEC].gst) {
+ if (MM_ERROR_NONE != __mm_wfd_sink_prepare_videodec(wfd_sink, v_decodebin[WFD_SINK_V_D_H265_DEC].gst)) {
+ wfd_sink_error("failed to set video decoder property...");
+ goto CREATE_ERROR;
+ }
+ }
+ }
+
g_list_free(element_bucket);
/* take it */
#include <tzplatform_config.h>
#include "mm_wfd_sink_enum.h"
-#define DUMP_TS_DATA_PATH tzplatform_mkpath(TZ_SYS_VAR, "tmp/")
+#define DUMP_TS_DATA_PATH tzplatform_mkpath(TZ_SYS_VAR, "/tmp/")
+#define TS_DUMP_FILE_FORMAT "%s%s_%s.ts"
static GstPadProbeReturn
_mm_wfd_sink_util_dump(GstPad *pad, GstPadProbeInfo *info, gpointer u_data)
return GST_PAD_PROBE_OK;
}
- snprintf(path, sizeof(path), "%s%s_%s.ts", DUMP_TS_DATA_PATH, gst_element_get_name(parent), gst_pad_get_name(pad));
+ snprintf(path, sizeof(path), TS_DUMP_FILE_FORMAT, DUMP_TS_DATA_PATH, gst_element_get_name(parent), gst_pad_get_name(pad));
gst_object_unref(parent);
if (info && info->type & GST_PAD_PROBE_TYPE_BUFFER) {
probe_pad = gst_element_get_static_pad(element, pad_name);
if (probe_pad) {
+ char file_path[256] = {0, };
+ snprintf(file_path, sizeof(file_path), TS_DUMP_FILE_FORMAT, DUMP_TS_DATA_PATH, gst_element_get_name(element), pad_name);
+ remove(file_path);
+
wfd_sink_debug("add pad(%s) probe", GST_STR_NULL(GST_PAD_NAME(probe_pad)));
gst_pad_add_probe(probe_pad, GST_PAD_PROBE_TYPE_BUFFER, _mm_wfd_sink_util_dump, (gpointer)NULL, NULL);
gst_object_unref(probe_pad);