Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2013-12-21 19:57:31 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2013-12-21 19:57:31 +0400
commit071178984b5506ac08945275035f2e5f96b73e2f (patch)
treeec0f668dd1fd286ae195cf693ec4637d94b4fef3 /demuxer
parentd330a6234b3298181fa5a10a1db4ccaff51076e5 (diff)
Expose rotation metadata from MP4 files
Diffstat (limited to 'demuxer')
-rw-r--r--demuxer/Demuxers/LAVFDemuxer.cpp34
-rw-r--r--demuxer/Demuxers/LAVFDemuxer.h2
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: