| /* ------------------------------------------------------------------ |
| * Copyright (C) 1998-2009 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. |
| * ------------------------------------------------------------------- |
| */ |
| |
| |
| #include "textsampleentry.h" |
| #include "atomutils.h" |
| #include "a_atomdefs.h" |
| #include "boxrecord.h" |
| #include "stylerecord.h" |
| #include "fonttableatom.h" |
| #include "textsampledescinfo.h" |
| |
| |
| |
| // Constructor |
| PVA_FF_TextSampleEntry::PVA_FF_TextSampleEntry() |
| : PVA_FF_SampleEntry(TEXT_SAMPLE_ENTRY) |
| { |
| |
| init(); |
| recomputeSize(); |
| |
| |
| } |
| |
| // Destructor |
| PVA_FF_TextSampleEntry::~PVA_FF_TextSampleEntry() |
| { |
| if (_pBackgroundRGBA) |
| { |
| OSCL_FREE(_pBackgroundRGBA); |
| _pBackgroundRGBA = NULL; |
| } |
| PV_MP4_FF_DELETE(NULL, PVA_FF_BoxRecord, _pBoxRecord); |
| PV_MP4_FF_DELETE(NULL, PVA_FF_StyleRecord, _pStyleRecord); |
| PV_MP4_FF_DELETE(NULL, PVA_FF_FontTableAtom, _pFontTableAtom); |
| } |
| |
| void PVA_FF_TextSampleEntry::init() |
| { |
| for (int i = 0; i < 6; i++) |
| { |
| _reserved[i] = 0; |
| } |
| _dataReferenceIndex = 1; |
| _preDefined1 = 0; |
| _reserved1 = 0; |
| |
| for (int j = 0; j < 3; j++) |
| { |
| _predefined2[j] = 0; |
| } |
| |
| _reserved2 = 0; |
| _preDefined2 = 0; |
| _predefined3 = -1; |
| |
| PV_MP4_FF_NEW(fp->auditCB, PVA_FF_BoxRecord, (), _pBoxRecord); |
| PV_MP4_FF_NEW(fp->auditCB, PVA_FF_StyleRecord, (), _pStyleRecord); |
| PV_MP4_FF_NEW(fp->auditCB, PVA_FF_FontTableAtom, (), _pFontTableAtom); |
| |
| } |
| |
| |
| void PVA_FF_TextSampleEntry::addTextDecoderSpecificInfo(PVA_FF_TextSampleDescInfo *pinfo) |
| { |
| _displayFlags = pinfo->display_flags; |
| _horzJustification = pinfo->hJust; |
| _vertJustification = pinfo->vJust; |
| |
| _pBackgroundRGBA = (uint8 *)(OSCL_MALLOC(4 * sizeof(uint8))); |
| _pBackgroundRGBA[0] = pinfo->bkRgba[0]; |
| _pBackgroundRGBA[1] = pinfo->bkRgba[1]; |
| _pBackgroundRGBA[2] = pinfo->bkRgba[2]; |
| _pBackgroundRGBA[3] = pinfo->bkRgba[3]; |
| |
| _start_sample_num = pinfo->start_sample_num; |
| _end_sample_num = pinfo->end_sample_num; |
| _sdIndex = pinfo->sdindex; |
| |
| int16 top = pinfo->top; |
| _pBoxRecord->setBoxTop(top); |
| |
| int16 left = pinfo->left; |
| _pBoxRecord->setBoxLeft(left); |
| |
| int16 bottom = pinfo->bottom; |
| _pBoxRecord->setBoxBottom(bottom); |
| |
| int16 right = pinfo->right; |
| _pBoxRecord->setBoxRight(right); |
| |
| uint16 startchar = pinfo->startChar; |
| _pStyleRecord->setStartChar(startchar); |
| |
| uint16 endchar = pinfo->endChar; |
| _pStyleRecord->setEndChar(endchar); |
| |
| uint16 fontid = pinfo->font_id; |
| _pStyleRecord->setFontID(fontid); |
| |
| uint8 fontsize_flag = pinfo->fontSizeFlags; |
| _pStyleRecord->setFontStyleFlags(fontsize_flag); |
| |
| uint8 fontsize = pinfo->fontSize; |
| _pStyleRecord->setFontSize(fontsize); |
| |
| uint8* tRGBA = pinfo->tRgba; |
| _pStyleRecord->setTextColourRGBA(tRGBA); |
| |
| uint16 fontlistsize = pinfo->fontListSize; |
| _pFontTableAtom->setFontListSize(fontlistsize); |
| |
| uint16 Fontlistid = pinfo->fontListID; |
| uint16 FontID = pinfo->fontID; |
| int8 Fontlength = pinfo->font_length; |
| uint8* Fontname = pinfo->font_name; |
| _pFontTableAtom->setFontRecord(Fontlistid, FontID, Fontlength, Fontname); |
| |
| |
| } |
| |
| |
| // Rendering the PVA_FF_Atom in proper format (bitlengths, etc.) to an ostream |
| bool PVA_FF_TextSampleEntry::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP *fp) |
| { |
| |
| int32 rendered = 0; |
| if (!renderAtomBaseMembers(fp)) |
| { |
| return false; |
| } |
| rendered += getDefaultSize(); |
| |
| // From PVA_FF_SampleEntry base class |
| for (int k = 0; k < 6; k++) |
| { |
| if (!PVA_FF_AtomUtils::render8(fp, _reserved[k])) |
| { |
| return false; |
| } |
| rendered += 1; |
| } |
| |
| |
| if (!PVA_FF_AtomUtils::render16(fp, _dataReferenceIndex)) |
| { |
| return false; |
| } |
| rendered += 2; |
| if (!PVA_FF_AtomUtils::render32(fp, _displayFlags)) |
| { |
| return false; |
| } |
| rendered += 4; |
| if (!PVA_FF_AtomUtils::render8(fp, _horzJustification)) |
| { |
| return false; |
| } |
| rendered += 1; |
| if (!PVA_FF_AtomUtils::render8(fp, _vertJustification)) |
| { |
| return false; |
| } |
| rendered += 1; |
| if (!PVA_FF_AtomUtils::renderByteData(fp, 4, (uint8 *)_pBackgroundRGBA)) |
| { |
| return false; |
| } |
| rendered += 4; |
| |
| if (!_pBoxRecord->renderToFileStream(fp)) |
| { |
| return false; |
| } |
| rendered += _pBoxRecord->getSize(); |
| |
| if (!_pStyleRecord->renderToFileStream(fp)) |
| { |
| return false; |
| } |
| rendered += _pStyleRecord->getSize(); |
| |
| if (!_pFontTableAtom->renderToFileStream(fp)) |
| { |
| return false; |
| } |
| rendered += _pFontTableAtom->getSize(); |
| return true; |
| } |
| |
| void PVA_FF_TextSampleEntry::recomputeSize() |
| { |
| int32 size = getDefaultSize(); |
| |
| size += 8; // For reserved and dataRefIndex of PVA_FF_SampleEntry base class |
| |
| size += 4; |
| size += 1; |
| size += 1; |
| size += 4; |
| size += _pBoxRecord->getSize(); |
| size += _pStyleRecord->getSize(); |
| size += _pFontTableAtom->getSize(); |
| _size = size; |
| |
| // Update size of parent |
| if (_pparent != NULL) |
| { |
| _pparent->recomputeSize(); |
| } |
| } |