diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-03-06 12:13:51 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-03-06 12:13:51 +0300 |
commit | b3447481c97b8bc23c8654848623ca452946f377 (patch) | |
tree | 905af72f1ced71c7a2af42528df21c64c6bc2550 /demuxer | |
parent | a112efea2adad28c726265251bae924f9527c7ee (diff) |
Export a list of all PGS depth offsets as stereo_subtitle_offset_ids
This works similar to stereo_interactive_offset_ids
Diffstat (limited to 'demuxer')
-rw-r--r-- | demuxer/Demuxers/BDDemuxer.cpp | 36 | ||||
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.cpp | 1 |
2 files changed, 33 insertions, 4 deletions
diff --git a/demuxer/Demuxers/BDDemuxer.cpp b/demuxer/Demuxers/BDDemuxer.cpp index 809395fc..8c387bd7 100644 --- a/demuxer/Demuxers/BDDemuxer.cpp +++ b/demuxer/Demuxers/BDDemuxer.cpp @@ -584,15 +584,43 @@ void CBDDemuxer::ProcessBluRayMetadata() MPLS_PL * mpls = bd_get_title_mpls(m_pBD); if (mpls) { // Read the PG offsets and store them as metadata + std::list<uint8_t> pg_sequences; for (int i = 0; i < mpls->play_item[0].stn.num_pg; i++) { AVStream *avstream = m_lavfDemuxer->GetAVStreamByPID(mpls->play_item[0].stn.pg[i].pid); - if (avstream && mpls->play_item[0].stn.pg[i].ss_offset_sequence_id != 0xFF) { - char offset[4]; - _itoa_s(mpls->play_item[0].stn.pg[i].ss_offset_sequence_id, offset, 10); - av_dict_set(&avstream->metadata, "ss_offset_sequence_id", offset, 0); + if (mpls->play_item[0].stn.pg[i].ss_offset_sequence_id != 0xFF) { + pg_sequences.push_back(mpls->play_item[0].stn.pg[i].ss_offset_sequence_id); + if (avstream) { + char offset[4]; + _itoa_s(mpls->play_item[0].stn.pg[i].ss_offset_sequence_id, offset, 10); + av_dict_set(&avstream->metadata, "ss_offset_sequence_id", offset, 0); + } } } + // export the list of pg sequences + if (pg_sequences.size() > 0) + { + // strip duplicate entries + pg_sequences.unique(); + + int size = pg_sequences.size() * 4; + char *offsets = new char[size]; + offsets[0] = 0; + + // Append all offsets to the string + for (auto it = pg_sequences.begin(); it != pg_sequences.end(); it++) { + int len = strlen(offsets); + if (len > 0) { + offsets[len] = ','; + len++; + } + _itoa_s(*it, offsets + len, size - len, 10); + } + + av_dict_set(&m_lavfDemuxer->m_avFormat->metadata, "pg_offset_sequences", offsets, 0); + delete[] offsets; + } + // Export a list of all IG offsets if (mpls->play_item[0].stn.num_ig > 0) { std::list<uint8_t> ig_sequences; diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 93297a07..ec7b8ed4 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -1819,6 +1819,7 @@ static struct { { "stereoscopic3dmode", "stereo_mode", 1 }, { "stereo_mode", nullptr, 1 }, { "stereo_subtitle_offset_id", "ss_offset_sequence_id", 3 }, + { "stereo_subtitle_offset_ids", "pg_offset_sequences", 0 }, { "stereo_interactive_offset_ids", "ig_offset_sequences", 0 }, }; |