| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | 
							- #include <bfc/platform/types.h>
 
- #include <windows.h>
 
- #include "api__in_avi.h"
 
- #include "win32_avi_reader.h"
 
- #include "../nsavi/metadata.h"
 
- #include "../nu/ns_wc.h"
 
- #include <strsafe.h>
 
- #include "resource.h"
 
- static void ReadMetadata(nsavi::Metadata &metadata, uint32_t id, wchar_t *dest, size_t destlen)
 
- {
 
- 	nsavi::Info *info=0;
 
- 	const char *str = 0;
 
- 	if (metadata.GetInfo(&info) == nsavi::READ_OK && (str = info->GetMetadata(id)))
 
- 	{
 
- 		MultiByteToWideCharSZ(CP_ACP/*UTF8*/, 0, str, -1, dest, (int)destlen);
 
- 	}
 
- 	else
 
- 		dest[0]=0;
 
- }
 
- extern "C" __declspec(dllexport)
 
- int winampGetExtendedFileInfoW(const wchar_t *fn, const char *data, wchar_t *dest, size_t destlen)
 
- {
 
- 	if (!_stricmp(data, "type"))
 
- 	{
 
- 		dest[0]='1';
 
- 		dest[1]=0;
 
- 		return 1;
 
- 	}
 
- 	else if (!_stricmp(data, "family"))
 
- 	{
 
- 		int len;
 
- 		const wchar_t *p;
 
- 		if (!fn || !fn[0]) return 0;
 
- 		len = lstrlenW(fn);
 
- 		if (len < 4 || L'.' != fn[len - 4])  return 0;
 
- 		p = &fn[len - 3];
 
- 		if (!_wcsicmp(p, L"AVI") && S_OK == StringCchCopyW(dest, destlen, WASABI_API_LNGSTRINGW(IDS_FAMILY_STRING))) return 1;
 
- 		return 0;
 
- 	}
 
- 	else
 
- 	{
 
- 		AVIReaderWin32 reader;
 
- 		if (reader.Open(fn) == nsavi::READ_OK) 
 
- 		{
 
- 			nsavi::Metadata metadata(&reader); 
 
- 			uint32_t riff_type;
 
- 			metadata.GetRIFFType(&riff_type); // need to call this to get the party started
 
- 			// TODO: cache metadata object
 
- 			if (!_stricmp(data, "length"))
 
- 			{
 
- 				int time_ms;
 
- 				if (metadata.GetDuration(&time_ms) == nsavi::READ_OK)
 
- 					StringCchPrintf(dest, destlen, L"%d", time_ms);
 
- 				else
 
- 					dest[0]=0;
 
- 			}
 
- 			else if (!_stricmp(data, "height"))
 
- 			{
 
- 				nsavi::HeaderList header_list;
 
- 				if (metadata.GetHeaderList(&header_list) == nsavi::READ_OK && header_list.avi_header && header_list.avi_header->height)
 
- 					StringCchPrintf(dest, destlen, L"%d", header_list.avi_header->height);
 
- 				else
 
- 					dest[0]=0;
 
- 			}
 
- 			else if (!_stricmp(data, "width"))
 
- 			{
 
- 				nsavi::HeaderList header_list;
 
- 				if (metadata.GetHeaderList(&header_list) == nsavi::READ_OK && header_list.avi_header && header_list.avi_header->width)
 
- 					StringCchPrintf(dest, destlen, L"%d", header_list.avi_header->width);
 
- 				else
 
- 					dest[0]=0;
 
- 			}
 
- 			else if (!_stricmp(data, "bitrate"))
 
- 			{
 
- 				int time_ms = 0;
 
- 				uint64_t file_length = 0;
 
- 				if (metadata.GetDuration(&time_ms) == nsavi::READ_OK
 
- 					&& (file_length = reader.GetContentLength())
 
- 					&& time_ms > 0 && file_length > 0)
 
- 				{
 
- 					uint64_t bitrate = 8ULL * file_length / (uint64_t)time_ms;
 
- 					StringCchPrintf(dest, destlen, L"%I64u", bitrate);
 
- 				}
 
- 				else
 
- 					dest[0]=0;
 
- 			}
 
- 			else if (!_stricmp(data, "artist"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','A','R','T'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "publisher"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','P','U','B'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "album"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','A','L','B'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "composer"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','C','O','M'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "genre"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','G','N','R'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "comment"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','C','M','T'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "title"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','N','A','M'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "tool"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','S','F','T'), dest, destlen);
 
- 			}
 
- 			else if (!_stricmp(data, "copyright"))
 
- 			{
 
- 				ReadMetadata(metadata, nsaviFOURCC('I','C','O','P'), dest, destlen);
 
- 			}
 
- 			else
 
- 			{
 
- 				reader.Close();
 
- 				return 0;
 
- 			}
 
- 			reader.Close();
 
- 			return 1;
 
- 		}
 
- 	}
 
- 	return 0;
 
- }
 
 
  |