diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-12-21 19:57:31 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-12-21 19:57:31 +0400 |
commit | 071178984b5506ac08945275035f2e5f96b73e2f (patch) | |
tree | ec0f668dd1fd286ae195cf693ec4637d94b4fef3 /demuxer | |
parent | d330a6234b3298181fa5a10a1db4ccaff51076e5 (diff) |
Expose rotation metadata from MP4 files
Diffstat (limited to 'demuxer')
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.cpp | 34 | ||||
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.h | 2 |
2 files changed, 31 insertions, 5 deletions
diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 4c074dd4..33134d3e 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -1407,19 +1407,42 @@ STDMETHODIMP_(BSTR) CLAVFDemuxer::GetTrackCodecName(UINT aTrackIdx) ///////////////////////////////////////////////////////////////////////////// // IPropertyBag + +static struct { + const char *original; + const char *map; + bool bVideoStream; +} mappedPropertys[] = { + { "rotation", "rotate", true }, + { "rotate", nullptr, true }, +}; + STDMETHODIMP CLAVFDemuxer::Read(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog) { CheckPointer(pszPropName, E_INVALIDARG); CheckPointer(pVar, E_INVALIDARG); + int stream = -1; // Verify type if (pVar->vt != VT_EMPTY && pVar->vt != VT_BSTR) return E_FAIL; - // TODO: Do we need to map property names here? + ATL::CW2A propNameConv(pszPropName); + const char *propName = propNameConv; + + // Map property names + for (int i = 0; i < countof(mappedPropertys); i++) { + if (_stricmp(propName, mappedPropertys[i].original) == 0) { + if (mappedPropertys[i].map) + propName = mappedPropertys[i].map; + if (mappedPropertys[i].bVideoStream && !m_streams[video].empty()) + stream = m_streams[video][0].pid; + break; + } + } pVar->vt = VT_BSTR; - return GetBSTRMetadata(ATL::CW2A(pszPropName), &pVar->bstrVal); + return GetBSTRMetadata(propName, &pVar->bstrVal, stream); } STDMETHODIMP CLAVFDemuxer::Write(LPCOLESTR pszPropName, VARIANT *pVar) @@ -1998,12 +2021,15 @@ STDMETHODIMP_(int) CLAVFDemuxer::GetHasBFrames(DWORD dwStream) return m_avFormat->streams[dwStream]->codec->has_b_frames; } -STDMETHODIMP CLAVFDemuxer::GetBSTRMetadata(const char *key, BSTR *pbstrValue) +STDMETHODIMP CLAVFDemuxer::GetBSTRMetadata(const char *key, BSTR *pbstrValue, int stream) { if (!m_avFormat) return VFW_E_NOT_FOUND; - AVDictionaryEntry *entry = av_dict_get(m_avFormat->metadata, key, nullptr, 0); + if (stream >= (int)m_avFormat->nb_streams) + return E_INVALIDARG; + + AVDictionaryEntry *entry = av_dict_get(stream >= 0 ? m_avFormat->streams[stream]->metadata : m_avFormat->metadata, key, nullptr, 0); if (!entry || !entry->value || entry->value[0] == '\0') return VFW_E_NOT_FOUND; diff --git a/demuxer/Demuxers/LAVFDemuxer.h b/demuxer/Demuxers/LAVFDemuxer.h index 6d2f39b5..46757e77 100644 --- a/demuxer/Demuxers/LAVFDemuxer.h +++ b/demuxer/Demuxers/LAVFDemuxer.h @@ -159,7 +159,7 @@ private: static int avio_interrupt_cb(void *opaque); - STDMETHODIMP GetBSTRMetadata(const char *key, BSTR *pbstrValue); + STDMETHODIMP GetBSTRMetadata(const char *key, BSTR *pbstrValue, int stream = -1); STDMETHODIMP CreatePacketMediaType(Packet *pPacket, enum AVCodecID codec_id, BYTE *extradata, int extradata_size, BYTE *paramchange, int paramchange_size); private: |