예제 #1
0
bool UBWindowsMediaFile::close()
{
    bool result = true;

    if (mWMWriter)
    {
        if (FAILED(mWMWriter->EndWriting()))
        {
            result = false;
        }
    }

    if (mPushSink)
    {
        mPushSink->Disconnect();
        mPushSink->EndSession();
        mPushSink->Release();
    }

    if(mChapters.length() > 0)
    {
        IWMMetadataEditor *editor = 0;
        IWMHeaderInfo     *headerInfo = 0;

        WMCreateEditor(&editor);
        editor->Open((LPCTSTR) mVideoFileName.utf16());
        editor->QueryInterface(IID_IWMHeaderInfo, (void**)&headerInfo);

        foreach(MarkerInfo mi, mChapters)
        {
            headerInfo->AddMarker((LPWSTR)mi.label.utf16(),  msToSampleTime(mi.timestamp));
        }
예제 #2
0
파일: App.cpp 프로젝트: rkabir/Cinder
bool WMA::Close()
{
    m_bOpen = false;
    if(m_hWaitEvent) {
        if(m_pReader) {
            m_pReader->Stop();
        }

        SetEvent(m_hWaitEvent);
        EnterCriticalSection(&m_csTerm);
        LeaveCriticalSection(&m_csTerm);
        DeleteCriticalSection(&m_csTerm);
    }
    if(m_hWaitEvent)
    {
        CloseHandle(m_hWaitEvent);
        m_hWaitEvent = 0;
    }
    if(m_hRespondEvent)
    {
        CloseHandle(m_hRespondEvent);
        m_hRespondEvent = 0;
    }

    if(m_pHeaderInfo) {
        m_pHeaderInfo->Release();
        m_pHeaderInfo = 0;
    }

    if(m_pReaderAdvanced2) {
        m_pReaderAdvanced2->Release();
        m_pReaderAdvanced2 = 0;
    }

    if(m_pReaderAdvanced) {
        m_pReaderAdvanced->Release();
        m_pReaderAdvanced = 0;
    }

    if(m_pReader) {
        m_pReader->Release();
        m_pReader = 0;
    }

    if(m_pBuffer) {
        delete [] m_pBuffer;
        m_pBuffer = 0;
    }

    Clear();
    return true;
}
예제 #3
0
파일: App.cpp 프로젝트: rkabir/Cinder
bool WMA::PostOpen()
{
    WaitForSingleObject( m_hRespondEvent, INFINITE );
    if( FAILED(m_hrCallbackResult) ) {
        return false;
    }

    uint32_t nOutputCount;
    HRESULT hr = m_pReader->GetOutputCount( &nOutputCount );

    if( FAILED(hr) ) {
        return false;
    }

    //ensure this is audio only
    if( nOutputCount != 1 ) {
        return false;
    }

    uint32_t nOutputFormatCount;
    hr = m_pReader->GetOutputFormatCount(0, &nOutputFormatCount);
    if(FAILED(hr)) {
        return FALSE;
    }

    uint32_t nFormatSize = 0;
    BYTE* pBuf = 0;
    IWMOutputMediaProps* pProps = 0;
    for( uint32_t j = 0; j < nOutputFormatCount; j++ ) {
        hr = m_pReader->GetOutputFormat( 0, j, &pProps  );
        if(FAILED(hr)) {
            continue;
        }

        //get required size of the media type structure
        uint32_t nNewSize = 0;
        hr = pProps->GetMediaType( NULL, & nNewSize );
        if( FAILED(hr) ) {
            continue;
        }

        if(nNewSize > nFormatSize)
        {
            if( pBuf ) {
                delete [] pBuf;
                pBuf = 0;
            }

            nFormatSize = nNewSize;
            pBuf = new BYTE[nFormatSize];
        }

        WM_MEDIA_TYPE* pType = (WM_MEDIA_TYPE*) pBuf;
        hr = pProps->GetMediaType(pType, & nFormatSize);
        if(FAILED(hr))
            continue;


        if(pType->formattype == WMFORMAT_WaveFormatEx)
        {
            memcpy( &m_WaveFormatEx, pType->pbFormat, pType->cbFormat );
            if((m_WaveFormatEx.nChannels == 2) && (m_WaveFormatEx.wBitsPerSample == 16) && (m_WaveFormatEx.nSamplesPerSec == 44100)) {
                break;
            }
        }
        if(pProps) {
            pProps->Release();
            pProps = 0;
        }


    }
    if(pBuf) {
        delete [] pBuf;
        pBuf = 0;
    }

    m_pReader->SetOutputProps( 0, pProps );
    if(FAILED(hr)) {
        return false;
    }

    if(pProps) {
        pProps->Release();
        pProps = 0;
    }


    //tells it to read as fast possible
    //hr = m_pReaderAdvanced->SetUserProvidedClock(true);

    if(FAILED(hr)) {
        return false;
    }

    WORD wStreamNum = 0;
    WMT_ATTR_DATATYPE Type;
    QWORD dwDuration = 0;
    WORD wLength = 8;
    hr = m_pHeaderInfo->GetAttributeByName(&wStreamNum, g_wszWMDuration, &Type, (BYTE*)&dwDuration, &wLength);
    if(FAILED(hr)) {
        return false;
    }

    //divide by 10 million to get seconds
    double fTime = double(dwDuration) / 10000000.0f;

    m_nStreamSize = fTime * m_WaveFormatEx.nAvgBytesPerSec * 1.5;

    //create a default 1.5 second scratch buffer for seconding streams
    m_pBuffer = new uint8_t[m_WaveFormatEx.nAvgBytesPerSec * 1.5];
    m_nBufferSize = m_WaveFormatEx.nAvgBytesPerSec * 1.5;

    m_nTargetPtr = 0;
    m_nWritePtr = 0;

    m_bOpen = true;

    return true;
}
예제 #4
0
//------------------------------------------------------------------------------
// Name: ShowAttributes()
// Desc: Display all attributes for the specified stream,
//       using IWMHeaderInfo.
//------------------------------------------------------------------------------
HRESULT ShowAttributes( __in LPWSTR pwszInFile, WORD wStreamNum )
{
    HRESULT             hr                  = S_OK;

    IWMMetadataEditor   * pEditor           = NULL;
    IWMHeaderInfo*      pHeaderInfo         = NULL;

    WCHAR               * pwszAttribName    = NULL;
    WORD                wAttribNameLen      = 0;
    WMT_ATTR_DATATYPE   wAttribType;
    BYTE                * pbAttribValue     = NULL;
    WORD                wAttribValueLen     = 0;

    do
    {
        hr = EditorOpenFile( pwszInFile, &pEditor, &pHeaderInfo, NULL );
        if(FAILED( hr ) )
        {
            break;
        }

        WORD wAttributeCount = 0;

        hr = pHeaderInfo->GetAttributeCount( wStreamNum, &wAttributeCount );
        if(FAILED( hr ) )
        {
            _tprintf( _T( "GetAttributeCount failed for stream = %d ( hr=0x%08x ).\n" ), 
                wStreamNum, hr );
            break;
        }

        PrintListHeader();

        for( WORD wAttribIndex = 0; wAttribIndex < wAttributeCount; wAttribIndex++ )
        {
            SAFE_ARRAYDELETE( pwszAttribName );
            SAFE_ARRAYDELETE( pbAttribValue );

            hr = pHeaderInfo->GetAttributeByIndex( wAttribIndex,
                                                   &wStreamNum,
                                                   pwszAttribName,
                                                   &wAttribNameLen,
                                                   &wAttribType,
                                                   pbAttribValue,
                                                   &wAttribValueLen );
            if( FAILED( hr ) )
            {
                _tprintf( _T( "GetAttributeByIndex failed for index = %d ( hr=0x%08x ).\n" ), 
                    wAttribIndex, hr );
                break;
            }

            pwszAttribName = new WCHAR[ wAttribNameLen ];
            if( NULL == pwszAttribName )
            {
                hr = E_OUTOFMEMORY;
                break;
            }

            pbAttribValue = new BYTE[ wAttribValueLen ];
            if( NULL == pbAttribValue )
            {
                hr = E_OUTOFMEMORY;
                break;
            }

            hr = pHeaderInfo->GetAttributeByIndex( wAttribIndex,
                                                   &wStreamNum,
                                                   pwszAttribName,
                                                   &wAttribNameLen,
                                                   &wAttribType,
                                                   pbAttribValue,
                                                   &wAttribValueLen );
            if( FAILED( hr ) )
            {
                _tprintf( _T( "GetAttributeByIndex failed for index = %d ( hr=0x%08x ).\n" ), 
                    wAttribIndex, hr );
                break;
            }

            hr = PrintAttribute( wAttribIndex, 
                                 wStreamNum, 
                                 pwszAttribName, 
                                 wAttribType, 
                                 0, 
                                 pbAttribValue, 
                                 wAttribValueLen );
            if( FAILED( hr ) )
            {
                break;
            }
        }
        
        hr = pEditor->Close();
        if( FAILED( hr ) )
        {
            _tprintf( _T( "Could not close the file %ws ( hr=0x%08x ).\n" ), pwszInFile, hr );
            break;
        }
    }
    while( FALSE );
    
    SAFE_RELEASE( pHeaderInfo );
    SAFE_RELEASE( pEditor );

    SAFE_ARRAYDELETE( pwszAttribName );
    SAFE_ARRAYDELETE( pbAttribValue );

    return( hr );
}
예제 #5
0
//------------------------------------------------------------------------------
// Name: SetAttrib()
// Desc: Adds an attribute by using IWMHeaderInfo::SetAttribute.
//------------------------------------------------------------------------------
HRESULT SetAttrib( __in LPWSTR pwszInFile, 
                   WORD wStreamNum, 
                   __in LPWSTR pwszAttribName, 
                   WORD wAttribType, 
                   __in LPWSTR pwszAttribValue )
{
    if( ( NULL == pwszInFile ) ||
        ( NULL == pwszAttribName ) ||
        ( NULL == pwszAttribValue ) )
    {
        return( E_INVALIDARG );
    }

    HRESULT hr = S_OK;

    IWMMetadataEditor   * pEditor       = NULL;
    IWMHeaderInfo       * pHeaderInfo   = NULL;

    BYTE*               pbAttribValue   = NULL;
    WORD                wAttribValueLen = 0;

    WMT_ATTR_DATATYPE   AttribDataType  = ( WMT_ATTR_DATATYPE ) wAttribType;

    DWORD               dwAttribValue   = 0;
    WORD                wAttribValue    = 0;
    QWORD               qwAttribValue   = 0;
    BOOL                fAttribValue    = 0;

    do
    {
        hr = EditorOpenFile( pwszInFile, &pEditor, &pHeaderInfo, NULL);
        if(FAILED( hr ) )
        {
            break;
        }

        switch( AttribDataType )
        {
        case WMT_TYPE_DWORD:
            dwAttribValue = _wtoi( pwszAttribValue );                               
            wAttribValueLen = sizeof( DWORD );
            pbAttribValue = (BYTE *)&dwAttribValue;

            break;

        case WMT_TYPE_WORD:
            wAttribValue = (WORD)_wtoi( pwszAttribValue );                                
            wAttribValueLen = sizeof(WORD);
            pbAttribValue = (BYTE *)&wAttribValue;

            break;

        case WMT_TYPE_QWORD:
            qwAttribValue = _wtoi64( pwszAttribValue );                             
            wAttribValueLen = sizeof(QWORD );
            pbAttribValue = (BYTE *)&qwAttribValue;

            break;
                    
        case WMT_TYPE_STRING:
            wAttribValueLen = ( wcslen( pwszAttribValue ) + 1 )* sizeof( WCHAR );
            pbAttribValue = (BYTE *)pwszAttribValue;

            break;

        case WMT_TYPE_BOOL:
            fAttribValue = (BOOL)_wtoi( pwszAttribValue );                              
            wAttribValueLen = sizeof(BOOL);
            pbAttribValue = (BYTE *)&fAttribValue;

            break;

        default:
            _tprintf( _T( "Unsupported data type for SetAttribute\n" ) );
            hr = E_INVALIDARG;
            break;
        }

        hr = pHeaderInfo->SetAttribute( wStreamNum,
                                        pwszAttribName,
                                        AttribDataType,                                        
                                        pbAttribValue,
                                        wAttribValueLen );
        if( FAILED( hr ) )
        {
            _tprintf( _T( "SetAttribute failed for Attribute name %ws ( hr=0x%08x ).\n" ), 
                pwszAttribName, hr );
            break;
        }

        hr = pEditor->Flush();
        if( FAILED( hr ) )
        {
            _tprintf( _T( "Could not flush the file %ws ( hr=0x%08x ).\n" ), 
                pwszInFile, hr );
            break;
        }

        hr = pEditor->Close();
        if( FAILED( hr ) )
        {
            _tprintf( _T( "Could not close the file %ws ( hr=0x%08x ).\n" ), 
                pwszInFile, hr );
            break;
        }
    }
    while( FALSE );
    
    SAFE_RELEASE( pHeaderInfo );
    SAFE_RELEASE( pEditor );

    return( hr );
}
예제 #6
0
int tagread(const string fname, struct fennec_audiotag *rtag)
{ 
	struct fennec_audiotag_item* ct;
	HRESULT               hres;
	IWMHeaderInfo*        wminfo;
	WORD                  wmistream = 0;
	IWMSyncReader*        wmreader;
	BOOL                  sdef = 1;

	if(!rtag)return 0;

	CoInitialize(0);

	if(!fname)
	{
		if(rtag->tag_title.tsize         ) { free(rtag->tag_title.tdata         ); rtag->tag_title.tsize         = 0; }
		if(rtag->tag_album.tsize         ) { free(rtag->tag_album.tdata         ); rtag->tag_album.tsize         = 0; }
		if(rtag->tag_artist.tsize        ) { free(rtag->tag_artist.tdata        ); rtag->tag_artist.tsize        = 0; }
		if(rtag->tag_origartist.tsize    ) { free(rtag->tag_origartist.tdata    ); rtag->tag_origartist.tsize    = 0; }
		if(rtag->tag_composer.tsize      ) { free(rtag->tag_composer.tdata      ); rtag->tag_composer.tsize      = 0; }
		if(rtag->tag_lyricist.tsize      ) { free(rtag->tag_lyricist.tdata      ); rtag->tag_lyricist.tsize      = 0; }
		if(rtag->tag_band.tsize          ) { free(rtag->tag_band.tdata          ); rtag->tag_band.tsize          = 0; }
		if(rtag->tag_copyright.tsize     ) { free(rtag->tag_copyright.tdata     ); rtag->tag_copyright.tsize     = 0; }
		if(rtag->tag_publish.tsize       ) { free(rtag->tag_publish.tdata       ); rtag->tag_publish.tsize       = 0; }
		if(rtag->tag_encodedby.tsize     ) { free(rtag->tag_encodedby.tdata     ); rtag->tag_encodedby.tsize     = 0; }
		if(rtag->tag_genre.tsize         ) { free(rtag->tag_genre.tdata         ); rtag->tag_genre.tsize         = 0; }
		if(rtag->tag_year.tsize          ) { free(rtag->tag_year.tdata          ); rtag->tag_year.tsize          = 0; }
		if(rtag->tag_url.tsize           ) { free(rtag->tag_url.tdata           ); rtag->tag_url.tsize           = 0; }
		if(rtag->tag_offiartisturl.tsize ) { free(rtag->tag_offiartisturl.tdata ); rtag->tag_offiartisturl.tsize = 0; }
      //if(rtag->tag_filepath.tsize      ) { free(rtag->tag_filepath.tdata      ); rtag->tag_filepath.tsize      = 0; }
      //if(rtag->tag_filename.tsize      ) { free(rtag->tag_filename.tdata      ); rtag->tag_filename.tsize      = 0; }
		if(rtag->tag_comments.tsize      ) { free(rtag->tag_comments.tdata      ); rtag->tag_comments.tsize      = 0; }
		if(rtag->tag_lyric.tsize         ) { free(rtag->tag_lyric.tdata         ); rtag->tag_lyric.tsize         = 0; }
		if(rtag->tag_bpm.tsize           ) { free(rtag->tag_bpm.tdata           ); rtag->tag_bpm.tsize           = 0; }
		if(rtag->tag_tracknum.tsize      ) { free(rtag->tag_tracknum.tdata      ); rtag->tag_tracknum.tsize      = 0; }

	}else{

		hres = WMCreateSyncReader(0, 0, &wmreader);
		if(FAILED(hres))return 0;

		hres = wmreader->Open(fname);

		/* get information */

		hres = wmreader->QueryInterface(IID_IWMHeaderInfo, (VOID **)&wminfo);
		if(FAILED(hres))return 0;

		wmistream = 0;


		ct = &rtag->tag_title;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMTitle);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;

		ct = &rtag->tag_album;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMAlbumTitle);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_artist;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMAuthor);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_origartist;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMOriginalArtist);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_composer;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMComposer);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_lyricist;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMWriter);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_band;
		ct->tdata  = 0;
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_copyright;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMCopyright);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_publish;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMPublisher);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_encodedby;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMEncodedBy);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_genre;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMGenre);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_year;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMYear);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_url;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMUserWebURL);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_offiartisturl;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMAuthorURL);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_comments;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMDescription);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_lyric;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMLyrics);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) + 2 : 0;
	
		ct = &rtag->tag_bpm;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMBeatsPerMinute);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;
	
		ct = &rtag->tag_tracknum;
		ct->tdata  = WM_GetTagString(wminfo, &wmistream, g_wszWMTrack);
		ct->tdatai = 0;
		ct->tmode  = ct->tdata ? tag_memmode_dynamic : tag_memmode_static;
		ct->tsize  = ct->tdata ? (unsigned int)str_size(ct->tdata) : 0;

		wminfo->Release();
		wmreader->Close();
		wmreader->Release();

	}
	return 1;
}
예제 #7
0
int tagwrite(const string fname,  struct fennec_audiotag *wtag)
{	

	HRESULT               hres;
	IWMHeaderInfo*        wminfo;
	WORD                  wmistream = 0;
	BOOL                  sdef = 1;
	IWMMetadataEditor    *pEdit = 0;
	IWMHeaderInfo        *pInfo = 0;
	int                   twrote = 1;

	if(!wtag)return 0;

	CoInitialize(0);

	hres = WMCreateEditor(&pEdit);
	hres = pEdit->Open(fname);

	pEdit->QueryInterface(IID_IWMHeaderInfo, (VOID **)(&wminfo));


	if(wtag->tag_title.tsize         ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMTitle          ,wtag->tag_title.tdata         ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMTitle          , 0); }

	if(wtag->tag_album.tsize         ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMAlbumTitle     ,wtag->tag_album.tdata         ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMAlbumTitle     , 0); }

	if(wtag->tag_artist.tsize        ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMAuthor         ,wtag->tag_artist.tdata        ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMAuthor         , 0); }
	
	if(wtag->tag_origartist.tsize    ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMOriginalArtist ,wtag->tag_origartist.tdata    ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMOriginalArtist , 0); }
	
	if(wtag->tag_composer.tsize      ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMComposer       ,wtag->tag_composer.tdata      ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMComposer       , 0); }
	
	if(wtag->tag_lyricist.tsize      ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMLyrics         ,wtag->tag_lyricist.tdata      ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMWriter         , 0); }
 
	/* band: not used */
	
	if(wtag->tag_copyright.tsize     ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMCopyright      ,wtag->tag_copyright.tdata     ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMCopyright      , 0); }
	
	if(wtag->tag_publish.tsize       ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMPublisher      ,wtag->tag_publish.tdata       ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMPublisher      , 0); }
	
	if(wtag->tag_encodedby.tsize     ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMEncodedBy      ,wtag->tag_encodedby.tdata     ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMEncodedBy      , 0); }
	
	if(wtag->tag_genre.tsize         ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMGenre          ,wtag->tag_genre.tdata         ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMGenre          , 0); }
	
	if(wtag->tag_year.tsize          ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMYear           ,wtag->tag_year.tdata          ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMYear           , 0); }
	
	if(wtag->tag_url.tsize           ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMUserWebURL     ,wtag->tag_url.tdata           ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMUserWebURL     , 0); }
	
	if(wtag->tag_offiartisturl.tsize ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMAuthorURL      ,wtag->tag_offiartisturl.tdata ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMAuthorURL      , 0); }
	
	if(wtag->tag_comments.tsize      ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMDescription    ,wtag->tag_comments.tdata      ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMDescription    , 0); }
	
	if(wtag->tag_lyric.tsize         ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMLyrics         ,wtag->tag_lyric.tdata         ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMLyrics         , 0); }

	if(wtag->tag_bpm.tsize           ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMBeatsPerMinute ,wtag->tag_bpm.tdata           ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMBeatsPerMinute , 0); }

	if(wtag->tag_tracknum.tsize      ){ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMTrack          ,wtag->tag_tracknum.tdata      ); }
	else{ twrote = WM_SetTagString(wminfo, &wmistream, g_wszWMTrack          , 0); }

	if(!twrote)
	{
		MessageBox(0, uni("Couldn't set tag(s), if you're setting tags on currently playing media, try stopping it."), uni("Error on tagging"), MB_ICONQUESTION);
	}

	pEdit->Flush();
	pEdit->Close();
	wminfo->Release();
	pEdit->Release();

	return 1;
}
예제 #8
0
int decoder_load(unsigned long id, const string sname)
{
	HRESULT               hres;
	IWMOutputMediaProps*  ppProps;
	WM_MEDIA_TYPE*        wmt = 0;
	DWORD                 wmpz = 0;
	WAVEFORMATEX          wfx;
	DWORD                 i, outcount = 0;
	IWMHeaderInfo*        wminfo;
	WORD                  wmistream = 0;
    WMT_ATTR_DATATYPE     Type;
	WORD                  wmilen;

	CoInitialize(0);

	hres = WMCreateSyncReader(0, 0, &pstreams[id].wmreader);
	if(FAILED(hres))return 0;

	hres = pstreams[id].wmreader->Open(sname);

	pstreams[id].wmreader->GetOutputCount(&outcount);

	for(i=0; i<outcount; i++)
	{
		
		hres = pstreams[id].wmreader->GetOutputProps(i, &ppProps);
		if(FAILED(hres))
		{
			ppProps->Release();
			continue;
		}

		hres = ppProps->GetMediaType(0, &wmpz);
		if(FAILED(hres))
		{
			ppProps->Release();
			continue;
		}

		wmt = (WM_MEDIA_TYPE*) malloc(wmpz);

		hres = ppProps->GetMediaType(wmt, &wmpz);

		if(WMMEDIATYPE_Audio != wmt->majortype)
		{
			ppProps->Release();
			free(wmt);
			continue;
		}

		memcpy(&wfx, wmt->pbFormat, wmt->cbFormat);

		pstreams[id].channels      = wfx.nChannels;
		pstreams[id].frequency     = wfx.nSamplesPerSec;
		pstreams[id].bitspersample = wfx.wBitsPerSample;

		pstreams[id].wmaudioout = i;

		free(wmt);

		ppProps->Release();
		break;
	}
	pstreams[id].buffer = 0;
	pstreams[id].buffersize = 0;

	/* get information */

	hres = pstreams[id].wmreader->QueryInterface(IID_IWMHeaderInfo, (VOID **)&wminfo);
	if(FAILED(hres))return 0;

	wmistream = 0;

	hres = wminfo->GetAttributeByName(&wmistream, g_wszWMDuration, &Type, 0, &wmilen);

	if(hres == S_OK)
	{
		QWORD dur;
		wminfo->GetAttributeByName(&wmistream, g_wszWMDuration, &Type, (BYTE*)&dur,&wmilen);
		pstreams[id].duration = (DWORD)(dur / 10000);
	}

	wminfo->Release();
	return 1;
}
예제 #9
0
HRESULT GetMediaMetadata(const TCHAR *szFileName,const TCHAR *szAttribute,BYTE **pszOutput)
{
    typedef HRESULT (WINAPI *WMCREATEEDITOR_PROC)(IWMMetadataEditor **);
    WMCREATEEDITOR_PROC pWMCreateEditor = NULL;
    HMODULE hWMVCore;
    IWMMetadataEditor *pEditor = NULL;
    IWMHeaderInfo *pWMHeaderInfo = NULL;
    HRESULT hr = E_FAIL;

    hWMVCore = LoadLibrary(_T("wmvcore.dll"));

    if(hWMVCore != NULL)
    {
        pWMCreateEditor = (WMCREATEEDITOR_PROC)GetProcAddress(hWMVCore,"WMCreateEditor");

        if(pWMCreateEditor != NULL)
        {
            hr = pWMCreateEditor(&pEditor);

            if(SUCCEEDED(hr))
            {
                hr = pEditor->Open(szFileName);

                if(SUCCEEDED(hr))
                {
                    hr = pEditor->QueryInterface(IID_PPV_ARGS(&pWMHeaderInfo));

                    if(SUCCEEDED(hr))
                    {
                        WORD wStreamNum;
                        WMT_ATTR_DATATYPE Type;
                        WORD cbLength;

                        /* Any stream. Should be zero for MP3 files. */
                        wStreamNum = 0;

                        hr = pWMHeaderInfo->GetAttributeByName(&wStreamNum,szAttribute,&Type,NULL,&cbLength);

                        if(SUCCEEDED(hr))
                        {
                            *pszOutput = (BYTE *)malloc(cbLength);

                            if(*pszOutput != NULL)
                            {
                                hr = pWMHeaderInfo->GetAttributeByName(&wStreamNum,szAttribute,&Type,
                                                                       *pszOutput,&cbLength);
                            }
                        }

                        pWMHeaderInfo->Release();
                    }
                }

                pEditor->Release();
            }
        }

        FreeLibrary(hWMVCore);
    }

    return hr;
}
void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter *source, const QString &fileSrc)
{
    m_metadata.clear();

#ifndef QT_NO_SHELLITEM
    if (!sHCreateItemFromParsingName) {
        QSystemLibrary lib(QStringLiteral("shell32"));
        sHCreateItemFromParsingName = (q_SHCreateItemFromParsingName)(lib.resolve("SHCreateItemFromParsingName"));
    }

    if (!fileSrc.isEmpty() && sHCreateItemFromParsingName) {
        IShellItem2* shellItem = 0;
        if (sHCreateItemFromParsingName(reinterpret_cast<const WCHAR*>(fileSrc.utf16()),
                                        0, IID_PPV_ARGS(&shellItem)) == S_OK) {

            IPropertyStore *pStore = 0;
            if (shellItem->GetPropertyStore(GPS_DEFAULT, IID_PPV_ARGS(&pStore)) == S_OK) {
                DWORD cProps;
                if (SUCCEEDED(pStore->GetCount(&cProps))) {
                    for (DWORD i = 0; i < cProps; ++i)
                    {
                        PROPERTYKEY key;
                        PROPVARIANT var;
                        PropVariantInit(&var);
                        if (FAILED(pStore->GetAt(i, &key)))
                            continue;
                        if (FAILED(pStore->GetValue(key, &var)))
                            continue;

                        if (IsEqualPropertyKey(key, PKEY_Author)) {
                            m_metadata.insert(QMediaMetaData::Author, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Title)) {
                            m_metadata.insert(QMediaMetaData::Title, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_SubTitle)) {
                            m_metadata.insert(QMediaMetaData::SubTitle, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_ParentalRating)) {
                            m_metadata.insert(QMediaMetaData::ParentalRating, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Comment)) {
                            m_metadata.insert(QMediaMetaData::Description, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Copyright)) {
                            m_metadata.insert(QMediaMetaData::Copyright, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_ProviderStyle)) {
                            m_metadata.insert(QMediaMetaData::Genre, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_Year)) {
                            m_metadata.insert(QMediaMetaData::Year, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_DateEncoded)) {
                            m_metadata.insert(QMediaMetaData::Date, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Rating)) {
                            m_metadata.insert(QMediaMetaData::UserRating,
                                              int((convertValue(var).toUInt() - 1) / qreal(98) * 100));
                        } else if (IsEqualPropertyKey(key, PKEY_Keywords)) {
                            m_metadata.insert(QMediaMetaData::Keywords, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Language)) {
                            m_metadata.insert(QMediaMetaData::Language, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_Publisher)) {
                            m_metadata.insert(QMediaMetaData::Publisher, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_Duration)) {
                            m_metadata.insert(QMediaMetaData::Duration,
                                              (convertValue(var).toLongLong() + 10000) / 10000);
                        } else if (IsEqualPropertyKey(key, PKEY_Audio_EncodingBitrate)) {
                            m_metadata.insert(QMediaMetaData::AudioBitRate, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_AverageLevel)) {
                            m_metadata.insert(QMediaMetaData::AverageLevel, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Audio_ChannelCount)) {
                            m_metadata.insert(QMediaMetaData::ChannelCount, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Audio_PeakValue)) {
                            m_metadata.insert(QMediaMetaData::PeakValue, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Audio_SampleRate)) {
                            m_metadata.insert(QMediaMetaData::SampleRate, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_AlbumTitle)) {
                            m_metadata.insert(QMediaMetaData::AlbumTitle, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_AlbumArtist)) {
                            m_metadata.insert(QMediaMetaData::AlbumArtist, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_Artist)) {
                            m_metadata.insert(QMediaMetaData::ContributingArtist, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_Composer)) {
                            m_metadata.insert(QMediaMetaData::Composer, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_Conductor)) {
                            m_metadata.insert(QMediaMetaData::Conductor, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_Lyrics)) {
                            m_metadata.insert(QMediaMetaData::Lyrics, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_Mood)) {
                            m_metadata.insert(QMediaMetaData::Mood, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_TrackNumber)) {
                            m_metadata.insert(QMediaMetaData::TrackNumber, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Music_Genre)) {
                            m_metadata.insert(QMediaMetaData::Genre, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_ThumbnailStream)) {
                            m_metadata.insert(QMediaMetaData::ThumbnailImage, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Video_FrameHeight)) {
                            QSize res;
                            res.setHeight(convertValue(var).toUInt());
                            if (SUCCEEDED(pStore->GetValue(PKEY_Video_FrameWidth, &var)))
                                res.setWidth(convertValue(var).toUInt());
                            m_metadata.insert(QMediaMetaData::Resolution, res);
                        } else if (IsEqualPropertyKey(key, PKEY_Video_HorizontalAspectRatio)) {
                            QSize aspectRatio;
                            aspectRatio.setWidth(convertValue(var).toUInt());
                            if (SUCCEEDED(pStore->GetValue(PKEY_Video_VerticalAspectRatio, &var)))
                                aspectRatio.setHeight(convertValue(var).toUInt());
                            m_metadata.insert(QMediaMetaData::PixelAspectRatio, aspectRatio);
                        } else if (IsEqualPropertyKey(key, PKEY_Video_FrameRate)) {
                            m_metadata.insert(QMediaMetaData::VideoFrameRate,
                                              convertValue(var).toReal() / 1000);
                        } else if (IsEqualPropertyKey(key, PKEY_Video_EncodingBitrate)) {
                            m_metadata.insert(QMediaMetaData::VideoBitRate, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Video_Director)) {
                            m_metadata.insert(QMediaMetaData::Director, convertValue(var));
                        } else if (IsEqualPropertyKey(key, PKEY_Media_Writer)) {
                            m_metadata.insert(QMediaMetaData::Writer, convertValue(var));
                        }

                        PropVariantClear(&var);
                    }
                }

                pStore->Release();
            }

            shellItem->Release();
        }
    }

    if (!m_metadata.isEmpty())
        goto send_event;
#endif

#ifndef QT_NO_WMSDK
    IWMHeaderInfo *info = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo);

    if (info) {
        Q_FOREACH (const QWMMetaDataKey &key, *qt_wmMetaDataKeys()) {
            QVariant var = getValue(info, key.wmName);
            if (var.isValid()) {
                if (key.qtName == QMediaMetaData::Duration) {
                    // duration is provided in 100-nanosecond units, convert to milliseconds
                    var = (var.toLongLong() + 10000) / 10000;
                } else if (key.qtName == QMediaMetaData::Resolution) {
                    QSize res;
                    res.setHeight(var.toUInt());
                    res.setWidth(getValue(info, L"WM/VideoWidth").toUInt());
                    var = res;
                } else if (key.qtName == QMediaMetaData::VideoFrameRate) {
                    var = var.toReal() / 1000.f;
                } else if (key.qtName == QMediaMetaData::PixelAspectRatio) {
                    QSize aspectRatio;
                    aspectRatio.setWidth(var.toUInt());
                    aspectRatio.setHeight(getValue(info, L"AspectRatioY").toUInt());
                    var = aspectRatio;
                } else if (key.qtName == QMediaMetaData::UserRating) {
                    var = (var.toUInt() - 1) / qreal(98) * 100;
                }

                m_metadata.insert(key.qtName, var);
            }
        }

        info->Release();
    }

    if (!m_metadata.isEmpty())
        goto send_event;
#endif
    {
        IAMMediaContent *content = 0;

        if ((!graph || graph->QueryInterface(
                 IID_IAMMediaContent, reinterpret_cast<void **>(&content)) != S_OK)
                && (!source || source->QueryInterface(
                        IID_IAMMediaContent, reinterpret_cast<void **>(&content)) != S_OK)) {
            content = 0;
        }

        if (content) {
            BSTR string = 0;

            if (content->get_AuthorName(&string) == S_OK)
                m_metadata.insert(QMediaMetaData::Author, convertBSTR(&string));

            if (content->get_Title(&string) == S_OK)
                m_metadata.insert(QMediaMetaData::Title, convertBSTR(&string));

            if (content->get_Description(&string) == S_OK)
                m_metadata.insert(QMediaMetaData::Description, convertBSTR(&string));

            if (content->get_Rating(&string) == S_OK)
                m_metadata.insert(QMediaMetaData::UserRating, convertBSTR(&string));

            if (content->get_Copyright(&string) == S_OK)
                m_metadata.insert(QMediaMetaData::Copyright, convertBSTR(&string));

            content->Release();
        }
    }

send_event:
    // DirectShowMediaPlayerService holds a lock at this point so defer emitting signals to a later
    // time.
    QCoreApplication::postEvent(this, new QEvent(QEvent::Type(MetaDataChanged)));
}