make audio decoder according to the use_swdecoder option 06/298306/2
authorEunhye Choi <eunhae1.choi@samsung.com>
Tue, 5 Sep 2023 08:46:39 +0000 (17:46 +0900)
committerEunhye Choi <eunhae1.choi@samsung.com>
Tue, 5 Sep 2023 09:26:01 +0000 (18:26 +0900)
- make audio decoder according to the use_swdecoder option
  which is set by SetTrack or Activate interface

[Version] 0.0.35

Change-Id: I95ba1cb69b6b1236f834037e53ebb586fa6c6238

packaging/libtrackrenderer.spec
src/trackrenderer.cpp

index d9b25b29b6d6dd62f3a034a34b19cafad14eae57..b639bc34487db7029f25db16d443e29487e8c613 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libtrackrenderer
 Summary:    new multimedia streaming player trackrenderer
-Version:    0.0.34
+Version:    0.0.35
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index 0bf0dcff13f7466b3c9575b9d5bb1173c5d2de2b..2cc35213df949a7ecc309d9693ed9ee890e6bda2 100644 (file)
@@ -1084,7 +1084,6 @@ bool TrackRenderer::CreateVideoPipeline_(const Track* track) {
       gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseVideo));
 
   GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
-
   if (!track->use_swdecoder &&
       !internal::GetIniValue(properties_, "use_default_video_codec_sw"))
     factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
@@ -1223,9 +1222,14 @@ bool TrackRenderer::CreateAudioPipeline_(const Track* track) {
 
   auto parse_caps =
       gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseAudio));
+
+  GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
+  if (!track->use_swdecoder)
+    factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
+
   if (!pipeline_->FactoryMake(Elements::kDecAudio,
                               static_cast<GstCaps*>(parse_caps ? parse_caps.get() : caps.GetCaps_()),
-                              GST_ELEMENT_FACTORY_TYPE_DECODER, NULL)) {
+                              factory_type, NULL)) {
     const ErrorType err = ErrorType::kNotSupportedAudioCodec;
     TRACKRENDERER_ERROR("fail to make decoder");
     eventlistener_->OnError(err);
@@ -2096,13 +2100,22 @@ bool TrackRenderer::ActivateAudioPipeline(GstCaps * caps) {
   pipeline_->FactoryMake(Elements::kParseAudio, caps,
     GST_ELEMENT_FACTORY_TYPE_PARSER, NULL);
 
+  Track track;
+  if (!track_util::GetActiveTrack(trackinfo_, kTrackTypeAudio, &track)) {
+    TRACKRENDERER_ERROR("Failed to find active audio track.");
+    return false;
+  }
+  GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
+  if (!track.use_swdecoder)
+    factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
+
   auto parse_caps =
     gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseAudio));
   auto parse_caps_str = gstguard::make_guard(gst_caps_to_string(parse_caps.get()));
   TRACKRENDERER_INFO("parse caps %s", parse_caps_str.get());
 
   if (!pipeline_->FactoryMake(Elements::kDecAudio, (GstCaps*)parse_caps.get(),
-    GST_ELEMENT_FACTORY_TYPE_DECODER, NULL)) {
+    factory_type, NULL)) {
     const ErrorType err = ErrorType::kNotSupportedAudioCodec;
     eventlistener_->OnError(err);
     return false;
@@ -2213,7 +2226,6 @@ bool TrackRenderer::Activate(TrackType type, const Track& track) {
         gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseVideo));
 
     GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
-
     if (!track.use_swdecoder &&
         !internal::GetIniValue(properties_, "use_default_video_codec_sw"))
       factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
@@ -2797,8 +2809,13 @@ bool TrackRenderer::ActivateAudio_() {
 
   auto caps = caps_builder_.Build(track, internal::IsDrmEmeElementNecessary(
                                               drm_property_, track.mimetype));
+
+  GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
+  if (!track.use_swdecoder)
+    factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
+
   pipeline_->FactoryMake(Elements::kDecAudio, (GstCaps*)caps.GetCaps_(),
-                          GST_ELEMENT_FACTORY_TYPE_DECODER, NULL);
+                          factory_type, NULL);
   pipeline_->FactoryMake(Elements::kSinkAudio, kAudioSinkName, NULL);
   if (volume_ != kVolumeNone) {
     SetVolume_();