/* get all compatible factories for caps */
factories =
- gst_element_factory_list_get_elements (type, GST_RANK_NONE);
+ gst_element_factory_list_get_elements (type, GST_RANK_MARGINAL);
if (factories) {
filtered =
gst_element_factory_list_filter (factories, caps, GST_PAD_SINK,
void CompleteSeeking_(void);
bool HasSubtitleOnly_() const;
bool ActivateAudioPipeline(GstCaps* caps);
+ void SetOpusChannelMappingFamily(const GstCapsWrapper& caps);
private:
EventListener* eventlistener_ = nullptr; // eventlistener is Defaultplayer
return true;
}
+void TrackRenderer::SetOpusChannelMappingFamily(const GstCapsWrapper& caps) {
+ auto p = gst_caps_get_structure((GstCaps*)caps.GetCaps_(), 0);
+ gint channels = 0;
+ gst_structure_get_int(p, "channels", &channels);
+
+ if (channels < 1 || channels > 8) {
+ TRACKRENDERER_WARN("skip setting channel-mapping-family, channels : %d", channels);
+ return;
+ }
+
+ int channel_mapping_family = (channels <= 2) ? 0 : 1;
+
+ TRACKRENDERER_INFO("set channel-mapping-family to %d", channel_mapping_family);
+ caps.SetValue("channel-mapping-family", G_TYPE_INT, channel_mapping_family);
+}
+
bool TrackRenderer::CreateAudioPipeline_(const Track* track) {
TRACKRENDERER_ENTER;
CreateAppSrc_(kTrackTypeAudio, track->mimetype);
auto caps = caps_builder_.Build(*track, false);
+
+ if (track->mimetype.find("audio/x-opus") != std::string::npos)
+ SetOpusChannelMappingFamily(caps);
+
if (!pipeline_->FactoryMake(Elements::kParseAudio, (GstCaps*)caps.GetCaps_(),
GST_ELEMENT_FACTORY_TYPE_PARSER, NULL))
TRACKRENDERER_ERROR("fail to make parser");