root/src/isomedia/ttml.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gf_isom_xml_subtitle_sample_add_text
  2. gf_isom_xml_subtitle_to_sample
  3. gf_isom_new_xml_subtitle_sample
  4. gf_isom_xml_subtitle_reset
  5. gf_isom_delete_xml_subtitle_sample
  6. gf_isom_parse_xml_subtitle_sample
  7. gf_isom_parse_xml_subtitle_sample_from_data

/*
 *          GPAC - Multimedia Framework C SDK
 *
 *          Authors: Cyril Concolato
 *          Copyright (c) Telecom ParisTech 2000-2012
 *                  All rights reserved
 *
 *  This file is part of GPAC / ISO Media File Format sub-project
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#include <gpac/internal/isomedia_dev.h>
#include <gpac/internal/media_dev.h>
#include <gpac/constants.h>

#ifndef GPAC_DISABLE_ISOM

#ifndef GPAC_DISABLE_TTML

/* blindly adds text to a sample following 3GPP Timed Text style */
GF_Err gf_isom_xml_subtitle_sample_add_text(GF_GenericSubtitleSample *samp, char *text_data, u32 text_len)
{
        if (!samp) return GF_BAD_PARAM;
        if (!text_len) return GF_OK;
        samp->text = (char*)gf_realloc(samp->text, sizeof(char) * (samp->len + text_len) );
        memcpy(samp->text + samp->len, text_data, sizeof(char) * text_len);
        samp->len += text_len;
        return GF_OK;
}

/*
 * Writing the xml sample structure into a sample buffer
 * - putting the text or XML in the sample directly
 * - optionally handle secondary resources (TODO)
*/
GF_ISOSample *gf_isom_xml_subtitle_to_sample(GF_GenericSubtitleSample *samp)
{
        GF_ISOSample *res;
        GF_BitStream *bs;
        if (!samp) return NULL;

        bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE);

        if (samp->len) gf_bs_write_data(bs, samp->text, samp->len);
        else     gf_bs_write_data(bs, "", 1);

        res = gf_isom_sample_new();
        if (!res) {
                gf_bs_del(bs);
                return NULL;
        }
        gf_bs_get_content(bs, &res->data, &res->dataLength);
        gf_bs_del(bs);
        res->IsRAP = RAP;
        return res;
}

GF_GenericSubtitleSample *gf_isom_new_xml_subtitle_sample()
{
        GF_GenericSubtitleSample *res;
        GF_SAFEALLOC(res, GF_GenericSubtitleSample);
        if (!res) return NULL;
        return res;
}

GF_Err gf_isom_xml_subtitle_reset(GF_GenericSubtitleSample *samp)
{
        if (!samp) return GF_BAD_PARAM;
        if (samp->text) gf_free(samp->text);
        samp->text = NULL;
        samp->len = 0;
        return GF_OK;
}

GF_EXPORT
void gf_isom_delete_xml_subtitle_sample(GF_GenericSubtitleSample * samp)
{
        gf_isom_xml_subtitle_reset(samp);
        gf_free(samp);
}

GF_EXPORT
GF_GenericSubtitleSample *gf_isom_parse_xml_subtitle_sample(GF_BitStream *bs)
{
        GF_GenericSubtitleSample *s = gf_isom_new_xml_subtitle_sample();

        /*empty sample*/
        if (!bs || !gf_bs_available(bs)) return s;

        s->len = gf_bs_read_u16(bs);
        if (s->len) {
                /*2 extra bytes for UTF-16 term char just in case (we don't know if a BOM marker is present or
                not since this may be a sample carried over RTP*/
                s->text = (char *) gf_malloc(sizeof(char)*(s->len+2) );
                s->text[s->len] = 0;
                s->text[s->len+1] = 0;
                gf_bs_read_data(bs, s->text, s->len);
        }
        return s;
}

GF_GenericSubtitleSample *gf_isom_parse_xml_subtitle_sample_from_data(char *data, u32 dataLength)
{
        GF_GenericSubtitleSample *s;
        GF_BitStream *bs;
        /*empty text sample*/
        if (!data || !dataLength) {
                return gf_isom_new_xml_subtitle_sample();
        }

        bs = gf_bs_new(data, dataLength, GF_BITSTREAM_READ);
        s = gf_isom_parse_xml_subtitle_sample(bs);
        gf_bs_del(bs);
        return s;
}


#endif /* GPAC_DISABLE_TTML */

#endif /*GPAC_DISABLE_ISOM*/

/* [<][>][^][v][top][bottom][index][help] */