From: SeokHoon Lee Date: Mon, 11 Sep 2017 05:57:20 +0000 (+0900) Subject: Add support code for VP8 X-Git-Tag: accepted/tizen/unified/20171018.062607~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a975840ce90ebda8fef0684c360c2d7e6bb206b6;p=platform%2Fcore%2Fmultimedia%2Flibmm-wfd.git Add support code for VP8 - Add to support for VP9 feature. Signed-off-by: SeokHoon Lee Change-Id: I669ea612f3063ca9e6fff72bbf95d91672b8505e --- diff --git a/packaging/libmm-wfd.spec b/packaging/libmm-wfd.spec index dffe459..e650f00 100644 --- a/packaging/libmm-wfd.spec +++ b/packaging/libmm-wfd.spec @@ -1,6 +1,6 @@ Name: libmm-wfd Summary: Multimedia Framework Wifi-Display Library -Version: 0.2.226 +Version: 0.2.227 Release: 0 Group: System/Libraries License: Apache-2.0 diff --git a/src/include/mm_wfd_sink.h b/src/include/mm_wfd_sink.h index e06c4cc..09e2d64 100644 --- a/src/include/mm_wfd_sink.h +++ b/src/include/mm_wfd_sink.h @@ -59,8 +59,9 @@ typedef enum { /* video codec */ typedef enum { MM_WFD_SINK_VIDEO_CODEC_NONE, - MM_WFD_SINK_VIDEO_CODEC_H264 = 0x1b, - MM_WFD_SINK_VIDEO_CODEC_H265 = 0x24 + MM_WFD_SINK_VIDEO_CODEC_H265 = 0x24, + MM_WFD_SINK_VIDEO_CODEC_VP9 = 0x91, + MM_WFD_SINK_VIDEO_CODEC_H264 = 0x1b } MMWFDSinkVideoCodec; typedef void(*MMWFDMessageCallback)(int error_type, MMWFDSinkStateType state_type, void *user_data); diff --git a/src/include/mm_wfd_sink_enum.h b/src/include/mm_wfd_sink_enum.h index a9ec4bd..b39eea5 100644 --- a/src/include/mm_wfd_sink_enum.h +++ b/src/include/mm_wfd_sink_enum.h @@ -55,7 +55,8 @@ typedef enum { typedef enum { WFD_VIDEO_UNKNOWN = 0, WFD_VIDEO_H264 = (1 << 0), - WFD_VIDEO_H265 = (1 << 1) + WFD_VIDEO_H265 = (1 << 1), + WFD_VIDEO_VP9 = (1 << 2) } WFDVideoCodecs; typedef enum { @@ -262,7 +263,9 @@ typedef enum { WFD2_H264_CHP2 = (1 << 2), /* Constrained High Profile2 */ WFD2_H264_BP = (1 << 3), /* Baseline Profile */ WFD2_H264_MP = (1 << 4), /* Main Profile */ - WFD2_H264_HP = (1 << 5) /* High Profile */ + WFD2_H264_HP = (1 << 5), /* High Profile */ + WFD2_H264_PROGRESSIVE_HIGH_PROFILE = (1 << 6), /* Progressive High Profile */ + WFD2_H264_PROGRESSIVE_HIGH_STILL_PICTURE = (1 << 7) /* Progressive High Still Picture */ } WFD2VideoH264ProfileEnum; typedef enum { diff --git a/src/include/mm_wfd_sink_ini.h b/src/include/mm_wfd_sink_ini.h index 6a19e04..3cdd66f 100644 --- a/src/include/mm_wfd_sink_ini.h +++ b/src/include/mm_wfd_sink_ini.h @@ -142,6 +142,8 @@ typedef struct __mm_wfd_sink_ini { gchar name_of_video_h264_decoder[WFD_SINK_INI_MAX_STRLEN]; gchar name_of_video_h265_parser[WFD_SINK_INI_MAX_STRLEN]; gchar name_of_video_h265_decoder[WFD_SINK_INI_MAX_STRLEN]; + gchar name_of_video_vp9_parser[WFD_SINK_INI_MAX_STRLEN]; + gchar name_of_video_vp9_decoder[WFD_SINK_INI_MAX_STRLEN]; gchar name_of_video_converter[WFD_SINK_INI_MAX_STRLEN]; gchar name_of_video_filter[WFD_SINK_INI_MAX_STRLEN]; gchar name_of_video_sink[WFD_SINK_INI_MAX_STRLEN]; diff --git a/src/include/mm_wfd_sink_priv.h b/src/include/mm_wfd_sink_priv.h index 80d04bd..7c7c61c 100644 --- a/src/include/mm_wfd_sink_priv.h +++ b/src/include/mm_wfd_sink_priv.h @@ -83,6 +83,8 @@ enum WFDSinkVideoDecodeBinElementID { 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 }; diff --git a/src/mm_wfd_sink_ini.c b/src/mm_wfd_sink_ini.c index fbd7c10..b1ce5f9 100644 --- a/src/mm_wfd_sink_ini.c +++ b/src/mm_wfd_sink_ini.c @@ -74,6 +74,8 @@ #define DEFAULT_NAME_OF_VIDEO_H264_DECODER "" #define DEFAULT_NAME_OF_VIDEO_H265_PARSER "" #define DEFAULT_NAME_OF_VIDEO_H265_DECODER "" +#define DEFAULT_NAME_OF_VIDEO_VP9_PARSER "" +#define DEFAULT_NAME_OF_VIDEO_VP9_DECODER "" #define DEFAULT_NAME_OF_VIDEO_CONVERTER "" #define DEFAULT_NAME_OF_VIDEO_FILTER "" #define DEFAULT_NAME_OF_VIDEO_SINK "" @@ -278,6 +280,8 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path) MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_h264_decoder, "pipeline:video h264 decoder element", DEFAULT_NAME_OF_VIDEO_H264_DECODER); MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_h265_parser, "pipeline:video h265 parser element", DEFAULT_NAME_OF_VIDEO_H265_PARSER); MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_h265_decoder, "pipeline:video h265 decoder element", DEFAULT_NAME_OF_VIDEO_H265_DECODER); + MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_vp9_parser, "pipeline:video vp9 parser element", DEFAULT_NAME_OF_VIDEO_VP9_PARSER); + MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_vp9_decoder, "pipeline:video vp9 decoder element", DEFAULT_NAME_OF_VIDEO_VP9_DECODER); MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_converter, "pipeline:video converter element", DEFAULT_NAME_OF_VIDEO_CONVERTER); MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_filter, "pipeline:video filter element", DEFAULT_NAME_OF_VIDEO_FILTER); MM_WFD_SINK_INI_GET_STRING(dict, ini->name_of_video_sink, "pipeline:video sink element", DEFAULT_NAME_OF_VIDEO_SINK); @@ -409,6 +413,8 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path) strncpy(ini->name_of_video_h264_decoder, DEFAULT_NAME_OF_VIDEO_H264_DECODER, WFD_SINK_INI_MAX_STRLEN - 1); strncpy(ini->name_of_video_h265_parser, DEFAULT_NAME_OF_VIDEO_H265_PARSER, WFD_SINK_INI_MAX_STRLEN - 1); strncpy(ini->name_of_video_h265_decoder, DEFAULT_NAME_OF_VIDEO_H265_DECODER, WFD_SINK_INI_MAX_STRLEN - 1); + strncpy(ini->name_of_video_vp9_parser, DEFAULT_NAME_OF_VIDEO_VP9_PARSER, WFD_SINK_INI_MAX_STRLEN - 1); + strncpy(ini->name_of_video_vp9_decoder, DEFAULT_NAME_OF_VIDEO_VP9_DECODER, WFD_SINK_INI_MAX_STRLEN - 1); strncpy(ini->name_of_video_converter, DEFAULT_NAME_OF_VIDEO_CONVERTER, WFD_SINK_INI_MAX_STRLEN - 1); strncpy(ini->name_of_video_filter, DEFAULT_NAME_OF_VIDEO_FILTER, WFD_SINK_INI_MAX_STRLEN - 1); strncpy(ini->name_of_video_sink, DEFAULT_NAME_OF_VIDEO_SINK, WFD_SINK_INI_MAX_STRLEN - 1); @@ -534,6 +540,8 @@ mm_wfd_sink_ini_load(mm_wfd_sink_ini_t *ini, const char *path) wfd_sink_debug("name_of_video_h264_decoder : %s", ini->name_of_video_h264_decoder); wfd_sink_debug("name_of_video_h265_parser : %s", ini->name_of_video_h265_parser); wfd_sink_debug("name_of_video_h265_decoder : %s", ini->name_of_video_h265_decoder); + wfd_sink_debug("name_of_video_vp9_parser : %s", ini->name_of_video_vp9_parser); + wfd_sink_debug("name_of_video_vp9_decoder : %s", ini->name_of_video_vp9_decoder); wfd_sink_debug("name_of_video_converter : %s", ini->name_of_video_converter); wfd_sink_debug("name_of_video_filter : %s", ini->name_of_video_filter); wfd_sink_debug("name_of_video_sink : %s", ini->name_of_video_sink); diff --git a/src/mm_wfd_sink_priv.c b/src/mm_wfd_sink_priv.c index 4f1fce0..0da778f 100644 --- a/src/mm_wfd_sink_priv.c +++ b/src/mm_wfd_sink_priv.c @@ -3872,6 +3872,12 @@ int __mm_wfd_sink_link_video_decodebin(mm_wfd_sink_t *wfd_sink) 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; + case MM_WFD_SINK_VIDEO_CODEC_VP9: + if (v_decodebin[WFD_SINK_V_D_VP9_PARSE].gst) + element_bucket = g_list_append(element_bucket, &v_decodebin[WFD_SINK_V_D_VP9_PARSE]); + if (v_decodebin[WFD_SINK_V_D_VP9_DEC].gst) + element_bucket = g_list_append(element_bucket, &v_decodebin[WFD_SINK_V_D_VP9_DEC]); + break; default: wfd_sink_error("video codec is not decied yet. cannot link video decpdebin..."); @@ -4265,6 +4271,10 @@ int __mm_wfd_sink_create_video_decodebin(mm_wfd_sink_t *wfd_sink) video_codec = WFD_VIDEO_H265; link = TRUE; break; + case MM_WFD_SINK_VIDEO_CODEC_VP9: + video_codec = WFD_VIDEO_VP9; + link = TRUE; + break; case MM_WFD_SINK_VIDEO_CODEC_NONE: default: wfd_sink_debug("video decodebin could NOT be linked now, just create"); @@ -4337,6 +4347,23 @@ int __mm_wfd_sink_create_video_decodebin(mm_wfd_sink_t *wfd_sink) } } } + if (video_codec & WFD_VIDEO_VP9) { + /* create parser */ + MMWFDSINK_CREATE_ELEMENT(v_decodebin, WFD_SINK_V_D_VP9_PARSE, wfd_sink->ini.name_of_video_vp9_parser, "video_vp9_parser", FALSE); + MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_VP9_PARSE].gst, "sink"); + MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_VP9_PARSE].gst, "src"); + + /* create dec */ + MMWFDSINK_CREATE_ELEMENT(v_decodebin, WFD_SINK_V_D_VP9_DEC, wfd_sink->ini.name_of_video_vp9_decoder, "video_vp9_dec", FALSE); + MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_VP9_DEC].gst, "sink"); + MMWFDSINK_PAD_PROBE(wfd_sink, NULL, v_decodebin[WFD_SINK_V_D_VP9_DEC].gst, "src"); + if (v_decodebin[WFD_SINK_V_D_VP9_DEC].gst) { + if (MM_ERROR_NONE != __mm_wfd_sink_prepare_videodec(wfd_sink, v_decodebin[WFD_SINK_V_D_VP9_DEC].gst)) { + wfd_sink_error("failed to set video decoder property..."); + goto CREATE_ERROR; + } + } + } g_list_free(element_bucket);