Add support code for VP8 96/148896/2
authorSeokHoon Lee <andy.shlee@samsung.com>
Mon, 11 Sep 2017 05:57:20 +0000 (14:57 +0900)
committerSeokHoon Lee <andy.shlee@samsung.com>
Mon, 11 Sep 2017 06:05:59 +0000 (15:05 +0900)
- Add to support for VP9 feature.

Signed-off-by: SeokHoon Lee <andy.shlee@samsung.com>
Change-Id: I669ea612f3063ca9e6fff72bbf95d91672b8505e

packaging/libmm-wfd.spec
src/include/mm_wfd_sink.h
src/include/mm_wfd_sink_enum.h
src/include/mm_wfd_sink_ini.h
src/include/mm_wfd_sink_priv.h
src/mm_wfd_sink_ini.c
src/mm_wfd_sink_priv.c

index dffe459..e650f00 100644 (file)
@@ -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
index e06c4cc..09e2d64 100644 (file)
@@ -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);
index a9ec4bd..b39eea5 100644 (file)
@@ -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 {
index 6a19e04..3cdd66f 100644 (file)
@@ -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];
index 80d04bd..7c7c61c 100644 (file)
@@ -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
 };
 
index fbd7c10..b1ce5f9 100644 (file)
@@ -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);
index 4f1fce0..0da778f 100644 (file)
@@ -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);