blob: a43c1a765e1a3e8edd6fa20b208a19e76a543919 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/**
* @file pvmf_timedtext.h
* @brief This file defines structures/utilities specific to timed text media
*
*/
#ifndef PVMF_TIMEDTEXT_H_INCLUDED
#define PVMF_TIMEDTEXT_H_INCLUDED
#ifndef OSCL_DEFALLOC_H_INCLUDED
#include "oscl_defalloc.h"
#endif
#ifndef OSCL_SHARED_PTR_H_INCLUDED
#include "oscl_shared_ptr.h"
#endif
#ifndef PVMF_MEDIA_DATA_IMPL_H_INCLUDED
#include "pvmf_media_data_impl.h"
#endif
#ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED
#include "pvmf_simple_media_buffer.h"
#endif
const PVUid32 PVMFTimedTextFormatSpecificInfo_UID = 0x1;
#define PVMFTIMEDTEXT_TRANSLATION_MATRIXSIZE 9
#define PVMFTIMEDTEXT_RGBA_ARRAYSIZE 4
/**
* Timed text track level parameters that would be transmitted as
* format specific info
**/
struct PVMFTimedTextFormatSpecificInfo
{
PVUid32 iUID32;
int16 iLayer;
int32 iTranslationMatrix[PVMFTIMEDTEXT_TRANSLATION_MATRIXSIZE];
uint32 iWidth;
uint32 iHeight;
};
/**
* Timed text font record entry that describes the font used
* in the text sample entry
**/
struct PVMFTimedTextFontRecord
{
uint16 iFontID;
uint8 iFontNameLength;
uint8* iFontName;
};
#define PVMF_TIMED_TEXT_UTF_16_MARKER_BYTE_1 0xFE
#define PVMF_TIMED_TEXT_UTF_16_MARKER_BYTE_2 0xFF
enum PVMFTimedTextStringFormatType
{
PVMF_TIMED_TEXT_STRING_FORMAT_UNKNOWN,
PVMF_TIMED_TEXT_STRING_FORMAT_UTF8,
PVMF_TIMED_TEXT_STRING_FORMAT_UTF16,
PVMF_TIMED_TEXT_STRING_FORMAT_UTF16_LE
};
/**
* Timed text sample entry that describes the associated
* text sample
**/
class PVMFTimedTextSampleEntry
{
public:
PVMFTimedTextSampleEntry()
{
iDisplayFlags = 0;
iHorizontalJustification = 0;
iVerticalJustification = 0;
oscl_memset(iBackgroundRGBA, 0, PVMFTIMEDTEXT_RGBA_ARRAYSIZE);
iBoxTop = 0;
iBoxLeft = 0;
iBoxBottom = 0;
iBoxRight = 0;
iStyleStartChar = 0;
iStyleEndChar = 0;
iStyleFontID = 0;
iStyleFontStyleFlags = 0;
iStyleFontSize = 0;
oscl_memset(iStyleTextColorRGBA, 0, PVMFTIMEDTEXT_RGBA_ARRAYSIZE);
iFontEntryCount = 0;
iFontRecordList = NULL;
}
~PVMFTimedTextSampleEntry()
{
if (iFontRecordList)
{
for (int32 i = 0; i < iFontEntryCount; ++i)
{
if (iFontRecordList[i].iFontName != NULL)
{
OSCL_ARRAY_DELETE(iFontRecordList[i].iFontName);
iFontRecordList[i].iFontName = NULL;
}
}
OSCL_ARRAY_DELETE(iFontRecordList);
iFontRecordList = NULL;
}
}
// Text sample entry info
uint32 iDisplayFlags;
int8 iHorizontalJustification;
int8 iVerticalJustification;
uint8 iBackgroundRGBA[PVMFTIMEDTEXT_RGBA_ARRAYSIZE];
// Box record info
int16 iBoxTop;
int16 iBoxLeft;
int16 iBoxBottom;
int16 iBoxRight;
// Style record info
uint16 iStyleStartChar;
uint16 iStyleEndChar;
uint16 iStyleFontID;
uint8 iStyleFontStyleFlags;
uint8 iStyleFontSize;
uint8 iStyleTextColorRGBA[PVMFTIMEDTEXT_RGBA_ARRAYSIZE];
// Font table
uint16 iFontEntryCount;
PVMFTimedTextFontRecord* iFontRecordList;
};
/**
* Container class transported in PVMFMediaData that contains
* a shared pointer to the text sample entry object and a pointer
* to the text sample data
**/
class PVMFTimedTextMediaData
{
public:
PVMFTimedTextMediaData()
{
iTextSample = NULL;
iFormatType = PVMF_TIMED_TEXT_STRING_FORMAT_UNKNOWN;
iTextStringLengthInBytes = 0;
iTextSampleLength = 0;
iTextSampleCapacity = 0;
iTextSampleDuration = 0;
}
~PVMFTimedTextMediaData()
{
iTextSampleEntry.Unbind();
}
// Shared pointer to a text sample entry object
// Use the GetRep() method to check for and retrieve the pointer
// to PVMFTimedTextSampleEntry object
OsclSharedPtr<PVMFTimedTextSampleEntry> iTextSampleEntry;
// Text sample data
// Pointer to the text sample data
uint8* iTextSample;
// length in bytes of actual text string
uint32 iTextStringLengthInBytes;
// Length of the valid text sample data including the text string and the modifiers
// in order to calculate the text sample modifier length, do :
// modifierLength = (iTextSampleLength - iTextStringLengthInBytes)
uint32 iTextSampleLength;
// Buffer capacity for iTextSample pointer. Can be equal to or larger than iTextSampleLength
uint32 iTextSampleCapacity;
// Sample duration in media timescale
uint32 iTextSampleDuration;
// Sample format
PVMFTimedTextStringFormatType iFormatType;
// Timestamp for the text sample in NPT (normal playback time) in milliseconds
// MIGHT BE DEPRECATED IN THE FUTURE SINCE NOT MAINTAINABLE.
PVMFTimestamp iTextSampleTimestampNPT;
};
/**
* The PVMFTimedTextMediaDataCleanup deallocator class
* takes care of calling the destructor for PVMFTimedTextMediaData
* before freeing the memory
*/
class PVMFTimedTextMediaDataCleanup : public OsclDestructDealloc
{
public:
PVMFTimedTextMediaDataCleanup(PVMFTimedTextMediaData& textmediadata, Oscl_DefAlloc* in_gen_alloc = NULL) :
iTextMediaData(&textmediadata), iGenAlloc(in_gen_alloc) {};
virtual ~PVMFTimedTextMediaDataCleanup() {};
virtual void destruct_and_dealloc(OsclAny* ptr)
{
// Call the text media data's destructor
iTextMediaData->~PVMFTimedTextMediaData();
if (!iGenAlloc)
{
OsclMemAllocator my_alloc;
my_alloc.deallocate(ptr);
}
else
{
iGenAlloc->deallocate(ptr);
}
};
private:
PVMFTimedTextMediaData* iTextMediaData;
Oscl_DefAlloc* iGenAlloc;
};
/**
* The PVMFTimedTextMediaDataAlloc allocator class
* takes care of allocating the refcounter, PVMFSimpleMediaBuffer container,
* PVMFTimedTextMediaData object, and the actual buffer space for the text sample in a single block of memory.
*/
class PVMFTimedTextMediaDataAlloc
{
public:
PVMFTimedTextMediaDataAlloc(Oscl_DefAlloc* opt_gen_alloc = 0):
gen_alloc(opt_gen_alloc) {};
OsclSharedPtr<PVMFMediaDataImpl> allocate(uint32 requested_size)
{
uint32 aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterDA));
uint32 aligned_cleanup_size = oscl_mem_aligned_size(sizeof(PVMFTimedTextMediaDataCleanup));
uint32 aligned_simplemb_size = oscl_mem_aligned_size(sizeof(PVMFSimpleMediaBuffer));
uint32 aligned_textmediadata_size = oscl_mem_aligned_size(sizeof(PVMFTimedTextMediaData));
uint32 aligned_requested_size = oscl_mem_aligned_size(requested_size);
uint32 totalmem_size = aligned_refcnt_size + aligned_cleanup_size + aligned_simplemb_size + aligned_textmediadata_size + aligned_requested_size;
// Allocate the memory
uint8* mem_ptr = NULL;
if (!gen_alloc)
{
OsclMemAllocator my_alloc;
mem_ptr = (uint8*) my_alloc.allocate(totalmem_size);
}
else
{
mem_ptr = (uint8*) gen_alloc->allocate(totalmem_size);
}
// Memory map
// | RefCtr | Cleanup | PVMFSimpleMediaBuffer | PVMFTimedTextMediaData | Text sample data |
// Create the text media data
PVMFTimedTextMediaData* textmediadata_ptr = OSCL_PLACEMENT_NEW(mem_ptr + aligned_refcnt_size + aligned_cleanup_size + aligned_simplemb_size, PVMFTimedTextMediaData());
textmediadata_ptr->iTextSample = mem_ptr + aligned_refcnt_size + aligned_cleanup_size + aligned_simplemb_size + aligned_textmediadata_size;
textmediadata_ptr->iTextSampleLength = 0;
textmediadata_ptr->iTextSampleCapacity = aligned_requested_size;
// Create the cleanup object
PVMFTimedTextMediaDataCleanup* cleanup_ptr = OSCL_PLACEMENT_NEW(mem_ptr + aligned_refcnt_size, PVMFTimedTextMediaDataCleanup(*textmediadata_ptr, gen_alloc));
// Create the refcount object
OsclRefCounter* my_refcnt = OSCL_PLACEMENT_NEW(mem_ptr, OsclRefCounterDA(mem_ptr, cleanup_ptr));
// Create the simple media buffer
PVMFMediaDataImpl* media_data_ptr = OSCL_PLACEMENT_NEW(mem_ptr + aligned_refcnt_size + aligned_cleanup_size, PVMFSimpleMediaBuffer((OsclAny*)textmediadata_ptr, aligned_textmediadata_size + aligned_requested_size, my_refcnt));
media_data_ptr->setMediaFragFilledLen(0, aligned_textmediadata_size + aligned_requested_size);
// Return as shared pointer
OsclSharedPtr<PVMFMediaDataImpl> shared_media_data(media_data_ptr, my_refcnt);
return shared_media_data;
}
private:
Oscl_DefAlloc* gen_alloc;
};
/**
* The PVMFTimedTextSampleEntryCleanupSA deallocator class
* takes care of calling the destructor for PVMFTimedTextSampleEntry
* before freeing the memory using a static allocator
*/
class PVMFTimedTextSampleEntryCleanupSA : public OsclDestructDealloc
{
public:
virtual ~PVMFTimedTextSampleEntryCleanupSA() {};
virtual void destruct_and_dealloc(OsclAny* ptr)
{
uint8* tmp_ptr = (uint8*) ptr;
uint32 aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterSA<PVMFTimedTextSampleEntryCleanupSA>));
tmp_ptr += aligned_refcnt_size;
PVMFTimedTextSampleEntry* tse_ptr = reinterpret_cast<PVMFTimedTextSampleEntry*>(tmp_ptr);
tse_ptr->~PVMFTimedTextSampleEntry();
OsclMemAllocator alloc;
alloc.deallocate(ptr);
}
};
/**
* The PVMFTimedTextSampleEntryCleanupDA deallocator class
* takes care of calling the destructor for PVMFTimedTextSampleEntry
* before freeing the memory using a passed-in allocator
*/
class PVMFTimedTextSampleEntryCleanupDA : public OsclDestructDealloc
{
public:
PVMFTimedTextSampleEntryCleanupDA(Oscl_DefAlloc& in_gen_alloc) :
gen_alloc(&in_gen_alloc) {};
virtual ~PVMFTimedTextSampleEntryCleanupDA() {};
virtual void destruct_and_dealloc(OsclAny* ptr)
{
uint8* tmp_ptr = (uint8*) ptr;
uint32 aligned_size = oscl_mem_aligned_size(sizeof(OsclRefCounterDA));
// skip the refcounter
tmp_ptr += aligned_size;
// skip the cleanup
aligned_size = oscl_mem_aligned_size(sizeof(PVMFTimedTextSampleEntryCleanupDA));
tmp_ptr += aligned_size;
PVMFTimedTextSampleEntry* tse_ptr = reinterpret_cast<PVMFTimedTextSampleEntry*>(tmp_ptr);
tse_ptr->~PVMFTimedTextSampleEntry();
gen_alloc->deallocate(ptr);
}
private:
Oscl_DefAlloc* gen_alloc;
};
/**
* The PVMFTimedTextSampleEntryUtil allocator utility class
* takes care of creating a shared pointer for PVMFTimedTextSampleEntry including
* the refcounter, cleanup object if allocator is passed-in, and the PVMFTimedTextSampleEntry object
*/
class PVMFTimedTextSampleEntryUtil
{
public:
PVMFTimedTextSampleEntryUtil() {};
~PVMFTimedTextSampleEntryUtil() {};
static OsclSharedPtr<PVMFTimedTextSampleEntry> CreatePVMFTimedTextSampleEntry(Oscl_DefAlloc* gen_alloc = NULL)
{
// Allocate enough room
uint8* my_ptr = NULL;
OsclRefCounter* my_refcnt;
uint32 aligned_tse_size = oscl_mem_aligned_size(sizeof(PVMFTimedTextSampleEntry));
// Must compute the aligned size for PVMFTimedTextSampleEntry.
if (gen_alloc)
{
// Memory map
// | RefCtr | Cleanup | PVMFTimedTextSampleEntry |
uint32 aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterDA));
uint32 aligned_cleanup_size = oscl_mem_aligned_size(sizeof(PVMFTimedTextSampleEntryCleanupDA));
my_ptr = (uint8*) gen_alloc->ALLOCATE(aligned_refcnt_size + aligned_cleanup_size + aligned_tse_size);
PVMFTimedTextSampleEntryCleanupDA* my_cleanup = OSCL_PLACEMENT_NEW(my_ptr + aligned_refcnt_size, PVMFTimedTextSampleEntryCleanupDA(*gen_alloc));
my_refcnt = OSCL_PLACEMENT_NEW(my_ptr, OsclRefCounterDA(my_ptr, my_cleanup));
my_ptr += aligned_refcnt_size + aligned_cleanup_size;
}
else
{
// Memory map
// | RefCtr | PVMFTimedTextSampleEntry |
OsclMemAllocator my_alloc;
uint32 aligned_refcnt_size = oscl_mem_aligned_size(sizeof(OsclRefCounterSA<PVMFTimedTextSampleEntryCleanupSA>));
my_ptr = (uint8*) my_alloc.ALLOCATE(aligned_refcnt_size + aligned_tse_size);
my_refcnt = OSCL_PLACEMENT_NEW(my_ptr, OsclRefCounterSA<PVMFTimedTextSampleEntryCleanupSA>(my_ptr));
my_ptr += aligned_refcnt_size;
}
PVMFTimedTextSampleEntry* tse_ptr = OSCL_PLACEMENT_NEW(my_ptr, PVMFTimedTextSampleEntry());
OsclSharedPtr<PVMFTimedTextSampleEntry> shared_tse(tse_ptr, my_refcnt);
return shared_tse;
}
};
#endif