Add setting the bitrate to video encoder 98/245598/8
authorHyunil <hyunil46.park@samsung.com>
Tue, 13 Oct 2020 02:48:26 +0000 (11:48 +0900)
committerHyunil <hyunil46.park@samsung.com>
Wed, 14 Oct 2020 00:00:44 +0000 (09:00 +0900)
- set bitrate by media_format_set_video_avg_bps()
- get bitrate by avg_bps of media_format_get_video_info()
- Add creating h263 format to test app.

[Issue Type] Improvement
[Version] 0.1.123

Change-Id: Idff91a1a914b362b0379392cf49d7ba4c957cffa
Signed-off-by: Hyunil <hyunil46.park@samsung.com>
include/media_streamer_priv.h
include/media_streamer_util.h
packaging/capi-media-streamer.spec
src/media_streamer_gst.c
src/media_streamer_node.c
test/media_streamer_test.c

index 96148b1..c81344c 100644 (file)
@@ -128,6 +128,7 @@ typedef struct {
        GstCaps *src_caps;
        GstCaps *sink_caps;
        gchar **exclude_names;
+       media_format_h out_fmt;
 } node_plug_s;
 
 /**
index 80e318d..e2a7f69 100644 (file)
@@ -197,6 +197,7 @@ typedef struct _media_streamer_wl_info_s {
 #define DEFAULT_ADAPTIVE_SINK               "hlssink"
 
 #define DEFAULT_VIDEO_FRAME_RATE            30
+#define DEFAULT_VIDEO_BITRATE               512000
 
 /* WebRTC */
 #define WEBRTC_PEER_ANSWER                  "answer"
index 14d0b2d..4dac37a 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-streamer
 Summary:    A Media Streamer API
-Version:    0.1.122
+Version:    0.1.123
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index 7e595ec..f210034 100644 (file)
@@ -601,7 +601,7 @@ GstElement *ms_combine_next_element(GstElement *previous_element, GstPad *prev_e
                                prev_caps = gst_pad_query_caps(src_pad, 0);
                        MS_SAFE_UNREF(src_pad);
                }
-               node_plug_s plug_info = {node_klass_type, NULL, prev_caps, NULL};
+               node_plug_s plug_info = {node_klass_type, NULL, prev_caps, NULL, NULL};
 
                /* Create Node by ini or registry */
                found_element = ms_node_element_create(&plug_info, node_type);
@@ -1379,6 +1379,9 @@ static GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info)
        node_info_s node_info = {MEDIA_STREAMER_PARSER_KLASS, DEFAULT_VIDEO_PARSER};
        media_format_mimetype_e encoder_type = MEDIA_FORMAT_MAX;
        GstCaps *enc_caps = NULL;
+       gint bitrate = 0;
+       media_format_mimetype_e mime;
+       gchar *encoder_name = NULL;
 
        ms_debug_fenter();
 
@@ -1390,12 +1393,21 @@ static GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info)
                ms_debug("No Video encoding format is set! Default will be: [%s]", MEDIA_STREAMER_DEFAULT_VIDEO_FORMAT);
        }
 
-
        /* Creating Video Encoder */
        encoder_info.info = ms_node_get_klass_by_its_type(MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER);
        encoder_info.src_caps = enc_caps;
        encoder_info.sink_caps = plug_info->sink_caps;
        encoder_info.exclude_names = NULL;
+       encoder_info.out_fmt = plug_info->out_fmt;
+
+       if (encoder_info.out_fmt) {
+               if (!media_format_get_video_info(encoder_info.out_fmt, &mime, NULL, NULL, &bitrate, NULL)) {
+                       if (mime & MEDIA_FORMAT_ENCODED) {
+                               if (bitrate > 0)
+                                       ms_info("bitrate[%d] is set by user", bitrate);
+                       }
+               }
+       }
 
        encoder_elem = ms_element_create_from_ini(&encoder_info, MEDIA_STREAMER_NODE_TYPE_VIDEO_ENCODER);
        if (!encoder_elem)
@@ -1410,6 +1422,14 @@ static GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info)
        use_zerocopy = ms_ini_get_boolean("general:use zerocopy", DEFAULT_USE_ZEROCOPY);
        if (use_zerocopy) {
                ms_info("Video encoder uses zerocopy");
+               if (bitrate > 0) {
+                       encoder_name = GST_OBJECT_NAME(encoder_elem);
+                       if (g_strrstr(encoder_name, "omx"))
+                               g_object_set(G_OBJECT(encoder_elem), "target-bitrate", bitrate, NULL);
+                       else if (g_strrstr(encoder_name, "sprd"))
+                               g_object_set(G_OBJECT(encoder_elem), "bitrate", bitrate, NULL);
+               }
+
                gst_bin_add(GST_BIN(encoder_bin), encoder_elem);
                __ms_add_ghostpad(encoder_elem, "src", encoder_bin, "src");
                __ms_add_ghostpad(encoder_elem, "sink", encoder_bin, "sink");
@@ -1429,9 +1449,10 @@ static GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info)
        MS_GET_CAPS_TYPE(enc_caps, src_type);
        encoder_type = ms_convert_video_string_format_to_media_format(src_type);
 
-       if (encoder_type == MEDIA_FORMAT_VP8) {
-               /* VP8 does not have parser */
-               g_object_set(G_OBJECT(encoder_elem), "deadline", 1, NULL);
+       if (encoder_type == MEDIA_FORMAT_VP8 || encoder_type == MEDIA_FORMAT_VP9) {
+               /* VP8 and VP9 does not have parser */
+               if (bitrate > 0)
+                       g_object_set(G_OBJECT(encoder_elem), "target-bitrate", bitrate, NULL);
 
                /* Adding elements to bin Video Encoder */
                gst_bin_add_many(GST_BIN(encoder_bin), video_convert, video_scale, encoder_elem, NULL);
@@ -1443,6 +1464,9 @@ static GstElement *__ms_video_encoder_element_create(node_plug_s *plug_info)
                }
                __ms_add_ghostpad(encoder_elem, "src", encoder_bin, "src");
        } else {
+               if (bitrate > 0 && encoder_type == MEDIA_FORMAT_H263)
+                       g_object_set(G_OBJECT(encoder_elem), "bitrate", bitrate, NULL);
+
                /* Creating Video Parser */
                parser_info.info = &node_info;
                parser_info.src_caps = enc_caps;
@@ -2479,7 +2503,7 @@ GstCaps *ms_create_caps_from_fmt(media_format_h fmt, const char *node_name)
        if (!media_format_get_audio_info(fmt, &mime, &channel, &samplerate, NULL, NULL)) {
                if (MEDIA_FORMAT_RAW == (mime & MEDIA_FORMAT_RAW)) {
                        caps = gst_caps_new_simple("audio/x-raw", "format", G_TYPE_STRING, ms_convert_audio_mime_to_string_format(mime), NULL);
-               } else if (MEDIA_FORMAT_ENCODED == (mime & MEDIA_FORMAT_ENCODED)) {
+               } else if (mime & MEDIA_FORMAT_ENCODED) {
                        if (mime == MEDIA_FORMAT_AAC)
                                caps = gst_caps_new_simple(ms_convert_audio_mime_to_string_format(mime), "mpegversion", G_TYPE_INT, 4, NULL);
                        else if (mime == MEDIA_FORMAT_MP3)
@@ -2502,7 +2526,7 @@ GstCaps *ms_create_caps_from_fmt(media_format_h fmt, const char *node_name)
                        caps = gst_caps_new_simple("video/x-raw", "framerate", GST_TYPE_FRACTION, frame_rate,
                                        1, "format", G_TYPE_STRING, ms_convert_video_mime_to_string_format(mime, node_name),
                                        "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
-               else if (MEDIA_FORMAT_ENCODED == (mime & MEDIA_FORMAT_ENCODED))
+               else if (mime & MEDIA_FORMAT_ENCODED)
                        caps = gst_caps_new_simple(ms_convert_video_mime_to_string_format(mime, node_name), "framerate", GST_TYPE_FRACTION, frame_rate,
                                                        1, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, NULL);
                caps_name = gst_caps_to_string(caps);
index fda9041..8877726 100644 (file)
@@ -889,7 +889,7 @@ int ms_node_create(media_streamer_node_s *node, media_format_h in_fmt, media_for
        sink_caps = in_fmt ? ms_create_caps_from_fmt(in_fmt, nodes_info[node->type].default_name) : NULL;
        src_caps = out_fmt ? ms_create_caps_from_fmt(out_fmt, nodes_info[node->type].default_name) : NULL;
 
-       node_plug_s plug_info = {&(nodes_info[node->type]), src_caps, sink_caps, NULL};
+       node_plug_s plug_info = {&(nodes_info[node->type]), src_caps, sink_caps, NULL, out_fmt};
 
        ms_info("Creating node with info: klass_name[%s]; default[%s]",
                        plug_info.info->klass_name, plug_info.info->default_name);
index bff8f47..7ed8c11 100644 (file)
@@ -141,6 +141,7 @@ typedef enum {
 #define VIDEO_WIDTH       352
 #define VIDEO_HIGHT       288
 #define VIDEO_FRAME_RATE  30
+#define H263_BITRATE      1024000
 #define AUDIO_CHANNEL     1
 #define AUDIO_SAMPLERATE  8000
 
@@ -194,6 +195,7 @@ media_streamer_node_h g_audio_sink = NULL;
 media_format_h vfmt_vp8 = NULL;
 media_format_h vfmt_i420 = NULL;
 media_format_h vfmt_encoded = NULL;
+media_format_h vfmt_h263 = NULL;
 media_format_h vfmt_h264 = NULL;
 media_format_h afmt_pcm = NULL;
 media_format_h afmt_f32le = NULL;
@@ -478,6 +480,15 @@ static void create_formats(void)
        media_format_set_video_height(vfmt_h264, VIDEO_HIGHT);
        media_format_set_video_frame_rate(vfmt_h264, VIDEO_FRAME_RATE);
 
+       media_format_create(&vfmt_h263);
+       if (media_format_set_video_mime(vfmt_h263, MEDIA_FORMAT_H263) != MEDIA_FORMAT_ERROR_NONE)
+               g_print("media_format_set_video_mime failed!");
+
+       media_format_set_video_width(vfmt_h263, VIDEO_WIDTH);
+       media_format_set_video_height(vfmt_h263, VIDEO_HIGHT);
+       media_format_set_video_frame_rate(vfmt_h263, VIDEO_FRAME_RATE);
+       media_format_set_video_avg_bps(vfmt_h263, H263_BITRATE);
+
        /* Define audio raw format */
        media_format_create(&afmt_pcm);
        if (media_format_set_audio_mime(afmt_pcm, MEDIA_FORMAT_PCM) != MEDIA_FORMAT_ERROR_NONE)
@@ -1723,7 +1734,7 @@ static void display_getting_seek_position_menu(void)
 static void display_autoplug_select_menu(void)
 {
        g_print("\n");
-       g_print("Please select Media Streamer pluging mode\n");
+       g_print("Please select Media Streamer plugging mode\n");
        g_print("By default will be used [%s] mode\n", g_autoplug_mode == TRUE ? "autoplug" : "manual");
        g_print("1. Manual mode \n");
        g_print("2. Autoplug mode \n");
@@ -2505,7 +2516,7 @@ void _interpret_autoplug_menu(char *cmd)
                g_print("Invalid input. Default autoplug mode will be used\n");
        }
 
-       g_print("Selected pluging mode is [%s]\n", g_autoplug_mode == TRUE ? "autoplug" : "manual");
+       g_print("Selected plugging mode is [%s]\n", g_autoplug_mode == TRUE ? "autoplug" : "manual");
 
        if (g_menu_preset & PRESET_RTP_STREAMER)
                g_sub_menu_state = SUBMENU_STATE_GETTING_IP;