@@ -135,6 +135,16 @@ AP4_Result CFragmentedSampleReader::ReadSample()
135135 if (m_track->GetType () == AP4_Track::Type::TYPE_AUDIO)
136136 streamType = DRM::DRMMediaType::AUDIO;
137137
138+ #ifdef TARGET_WEBOS
139+ // if we are not in secure path mode, adding SVP header/meta data is not needed
140+ if (m_track->GetType () == AP4_Track::Type::TYPE_VIDEO &&
141+ (!CSrvBroker::GetSettings ().IsSecurePathOverride ()))
142+ {
143+ LOG::LogF (LOGDEBUG, " Overriding VIDEO as non-secure path to: kStreamTypeAudio" );
144+ streamType = DRM::DRMMediaType::AUDIO;
145+ }
146+ #endif
147+
138148 AP4_Result result;
139149 if (!m_codecHandler->ReadNextSample (m_sample, m_sampleData))
140150 {
@@ -268,6 +278,11 @@ bool CFragmentedSampleReader::GetInformation(kodi::addon::InputstreamInfo& info)
268278
269279 isChanged |= m_codecHandler->GetInformation (info);
270280
281+ // store dvcc metadata
282+ if (auto dvcc = ParseDvcc ()) {
283+ PopulateDvccMetadata (info, dvcc);
284+ }
285+
271286 m_bSampleDescChanged = false ;
272287
273288 return isChanged;
@@ -511,7 +526,7 @@ void CFragmentedSampleReader::UpdateSampleDescription()
511526
512527 LOG::LogF (LOGDEBUG, " Codec fourcc: %s (%u)" , CODEC::FourCCToString (desc->GetFormat ()).c_str (),
513528 desc->GetFormat ());
514-
529+
515530 if (AP4_DYNAMIC_CAST (AP4_AudioSampleDescription, desc))
516531 {
517532 // Audio sample of any format
@@ -590,3 +605,53 @@ void CFragmentedSampleReader::ParseTrafTfrf(AP4_UuidAtom* uuidAtom)
590605 m_observer->OnTFRFatom (time, duration, m_track->GetMediaTimeScale ());
591606 }
592607}
608+
609+ AP4_DvccAtom* CFragmentedSampleReader::ParseDvcc ()
610+ {
611+ if (AP4_TrakAtom* trak = m_track->UseTrakAtom ()) {
612+ if (auto mdia = AP4_DYNAMIC_CAST (AP4_ContainerAtom,
613+ trak->GetChild (AP4_ATOM_TYPE_MDIA, 0 ))) {
614+ if (auto minf = AP4_DYNAMIC_CAST (AP4_ContainerAtom,
615+ mdia->GetChild (AP4_ATOM_TYPE_MINF, 0 ))) {
616+ if (auto stbl = AP4_DYNAMIC_CAST (AP4_ContainerAtom,
617+ minf->GetChild (AP4_ATOM_TYPE_STBL, 0 ))) {
618+ if (auto stsd = AP4_DYNAMIC_CAST (AP4_ContainerAtom,
619+ stbl->GetChild (AP4_ATOM_TYPE_STSD, 0 ))) {
620+ for (auto * eitem = stsd->GetChildren ().FirstItem (); eitem; eitem = eitem->GetNext ()) {
621+ auto entry_ctn = AP4_DYNAMIC_CAST (AP4_ContainerAtom, eitem->GetData ());
622+
623+ if (!entry_ctn) continue ;
624+ AP4_Atom* dv_atom = entry_ctn->GetChild (AP4_ATOM_TYPE_DVCC, 0 );
625+ if (!dv_atom) dv_atom = entry_ctn->GetChild (AP4_ATOM_TYPE_DVVC, 0 );
626+ if (!dv_atom) continue ;
627+
628+ if (auto dvcc = AP4_DYNAMIC_CAST (AP4_DvccAtom, dv_atom)) {
629+ return dvcc;
630+ }
631+ }
632+ }
633+ }
634+ }
635+ }
636+ }
637+
638+ return nullptr ;
639+ }
640+
641+ void CFragmentedSampleReader::PopulateDvccMetadata (kodi::addon::InputstreamInfo& info, AP4_DvccAtom* dvcc)
642+ {
643+ if (!dvcc)
644+ return ;
645+
646+ auto * meta = new INPUTSTREAM_DVCC_METADATA ();
647+ meta->m_dvVersionMajor = dvcc->GetDvVersionMajor ();
648+ meta->m_dvVersionMinor = dvcc->GetDvVersionMinor ();
649+ meta->m_dvProfile = dvcc->GetDvProfile ();
650+ meta->m_dvLevel = dvcc->GetDvLevel ();
651+ meta->m_rpuPresentFlag = dvcc->GetRpuPresentFlag ();
652+ meta->m_elPresentFlag = dvcc->GetElPresentFlag ();
653+ meta->m_blPresentFlag = dvcc->GetBlPresentFlag ();
654+ meta->m_dvBlSignalCompatibilityId = dvcc->GetDvBlSignalCompatibilityID ();
655+
656+ info.SetDvccMetadata (meta);
657+ }
0 commit comments