Ejemplo n.º 1
0
// Render atom to a file stream
bool
PVA_FF_MovieHeaderAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP *fp)
{
    int32 rendered = 0; // Keep track of number of bytes rendered

    // Render PVA_FF_Atom type and size
    if (!renderAtomBaseMembers(fp))
    {
        return false;
    }
    rendered += getDefaultSize();

    if (!PVA_FF_AtomUtils::render32(fp, getCreationTime()))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, getModificationTime()))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, getTimeScale()))
    {
        return false;
    }

    /*
     * To ensure that the total track duration includes the duration of the
     * last sample as well, which in our case fp same as the last but one.
     */
    //uint32 totalDuration = getDuration() + _deltaTS;
    uint32 totalDuration = getDuration();
    if (!PVA_FF_AtomUtils::render32(fp, totalDuration))
    {
        return false;
    }
    rendered += 16;

    uint32 reserved = 0x00010000;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 4;

    reserved = 0x0100;
    if (!PVA_FF_AtomUtils::render16(fp, (uint16)(reserved)))
    {
        return false;
    }
    rendered += 2;

    // const bit(32)[2]
    reserved = 0;
    if (!PVA_FF_AtomUtils::render16(fp, (uint16)(reserved)))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 10;

    // const bit(32)[9]
    reserved = 0x00010000;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 4;

    reserved = 0;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 12;

    reserved = 0x00010000;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 4;

    reserved = 0;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 12;

    reserved = 0x40000000;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 4;

    // const bit(32)[6] reserved = 0
    reserved = 0;
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, reserved))
    {
        return false;
    }
    rendered += 24;

    // _nextTrackID
    if (!PVA_FF_AtomUtils::render32(fp, _nextTrackID))
    {
        return false;
    }
    rendered += 4;

    return true;
}
// Rendering the PVA_FF_Atom in proper format (bitlengths, etc.) to an ostream.
bool
PVA_FF_TrackHeaderAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP *fp)
{
    int32 rendered = 0; // Keep track of number of bytes rendered
    uint32 trackID = 0;
    // Render PVA_FF_Atom type and size
    if (!renderAtomBaseMembers(fp))
    {
        return false;
    }
    rendered += getDefaultSize();

    if (getVersion() == 0)
    {
        if (!PVA_FF_AtomUtils::render32(fp,
                                        Oscl_Int64_Utils::get_uint64_lower32(getCreationTime())))
        {
            return false;
        }

        if (!PVA_FF_AtomUtils::render32(fp,
                                        Oscl_Int64_Utils::get_uint64_lower32(getModificationTime())))

        {
            return false;
        }
    }
    else // getVersion() == 1
    {
        if (!PVA_FF_AtomUtils::render64(fp, getCreationTime()))
        {
            return false;
        }
        if (!PVA_FF_AtomUtils::render64(fp, getModificationTime()))
        {
            return false;
        }
    }

    trackID = getTrackID();


    if (!PVA_FF_AtomUtils::render32(fp, trackID))
    {
        return false;
    }


    if (getVersion() == 0)
    {
        rendered += 12;
    }
    else
    {
        rendered += 20;
    }

    if (!PVA_FF_AtomUtils::render32(fp, _reserved1))
    {
        return false;
    }
    rendered += 4;

    /*
     * To ensure that the total track duration includes the duration of the
     * last sample as well, which in our case is same as the last but one.
     */

    uint64 totalDuration = getDuration();

    if (totalDuration == 0)
    {
        totalDuration = _currTrackDuration;
    }

    if (getVersion() == 0)
    {
        if (!PVA_FF_AtomUtils::render32(fp,
                                        Oscl_Int64_Utils::get_uint64_lower32(totalDuration)))
        {
            return false;
        }

        rendered += 4;
    }
    else // getVersion() == 1
    {
        if (!PVA_FF_AtomUtils::render64(fp, totalDuration))
        {
            return false;
        }

        rendered += 8;
    }

    if (!PVA_FF_AtomUtils::render32(fp, _reserved2[0]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved2[1]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved2[2]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render16(fp, _reserved3))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render16(fp, _reserved4))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[0]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[1]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[2]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[3]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[4]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[5]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[6]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[7]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved5[8]))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved6))
    {
        return false;
    }
    if (!PVA_FF_AtomUtils::render32(fp, _reserved7))
    {
        return false;
    }
    rendered += 60;

    return true;
}