/* * ISO File Format parsing library * * gstisoff.h * * Copyright (C) 2015 Samsung Electronics. All rights reserved. * Author: Thiago Santos * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library (COPYING); if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GST_ISOFF_H__ #define __GST_ISOFF_H__ #include #include G_BEGIN_DECLS #ifndef GST_ISOFF_API #define GST_ISOFF_API GST_EXPORT #endif typedef enum { GST_ISOFF_PARSER_OK, GST_ISOFF_PARSER_DONE, GST_ISOFF_PARSER_UNEXPECTED, GST_ISOFF_PARSER_ERROR } GstIsoffParserResult; GST_ISOFF_API gboolean gst_isoff_parse_box_header (GstByteReader * reader, guint32 * type, guint8 extended_type[16], guint * header_size, guint64 * size); #define GST_ISOFF_FOURCC_UUID GST_MAKE_FOURCC('u','u','i','d') #define GST_ISOFF_FOURCC_MOOF GST_MAKE_FOURCC('m','o','o','f') #define GST_ISOFF_FOURCC_MFHD GST_MAKE_FOURCC('m','f','h','d') #define GST_ISOFF_FOURCC_TFHD GST_MAKE_FOURCC('t','f','h','d') #define GST_ISOFF_FOURCC_TRUN GST_MAKE_FOURCC('t','r','u','n') #define GST_ISOFF_FOURCC_TRAF GST_MAKE_FOURCC('t','r','a','f') #define GST_ISOFF_FOURCC_TFDT GST_MAKE_FOURCC('t','f','d','t') #define GST_ISOFF_FOURCC_MDAT GST_MAKE_FOURCC('m','d','a','t') #define GST_ISOFF_FOURCC_MOOV GST_MAKE_FOURCC('m','o','o','v') #define GST_ISOFF_FOURCC_TRAK GST_MAKE_FOURCC('t','r','a','k') #define GST_ISOFF_FOURCC_TKHD GST_MAKE_FOURCC('t','k','h','d') #define GST_ISOFF_FOURCC_MDIA GST_MAKE_FOURCC('m','d','i','a') #define GST_ISOFF_FOURCC_MDHD GST_MAKE_FOURCC('m','d','h','d') #define GST_ISOFF_FOURCC_HDLR GST_MAKE_FOURCC('h','d','l','r') #define GST_ISOFF_FOURCC_SIDX GST_MAKE_FOURCC('s','i','d','x') /* handler type */ #define GST_ISOFF_FOURCC_SOUN GST_MAKE_FOURCC('s','o','u','n') #define GST_ISOFF_FOURCC_VIDE GST_MAKE_FOURCC('v','i','d','e') #define GST_ISOFF_SAMPLE_FLAGS_IS_LEADING(flags) (((flags) >> 26) & 0x03) #define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_DEPENDS_ON(flags) (((flags) >> 24) & 0x03) #define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_IS_DEPENDED_ON(flags) (((flags) >> 22) & 0x03) #define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_HAS_REDUNDANCY(flags) (((flags) >> 20) & 0x03) #define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_PADDING_VALUE(flags) (((flags) >> 17) & 0x07) #define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_IS_NON_SYNC_SAMPLE(flags) (((flags) >> 16) & 0x01) #define GST_ISOFF_SAMPLE_FLAGS_SAMPLE_DEGRADATION_PRIORITY(flags) (((flags) >> 0) & 0x0f) /* Smooth-Streaming specific boxes */ typedef struct _GstTfxdBox { guint8 version; guint32 flags; guint64 time; guint64 duration; } GstTfxdBox; typedef struct _GstTfrfBoxEntry { guint64 time; guint64 duration; } GstTfrfBoxEntry; typedef struct _GstTfrfBox { guint8 version; guint32 flags; gint entries_count; GArray *entries; } GstTfrfBox; /* Common boxes */ typedef struct _GstMfhdBox { guint32 sequence_number; } GstMfhdBox; typedef enum { GST_TFHD_FLAGS_BASE_DATA_OFFSET_PRESENT = 0x000001, GST_TFHD_FLAGS_SAMPLE_DESCRIPTION_INDEX_PRESENT = 0x000002, GST_TFHD_FLAGS_DEFAULT_SAMPLE_DURATION_PRESENT = 0x000008, GST_TFHD_FLAGS_DEFAULT_SAMPLE_SIZE_PRESENT = 0x000010, GST_TFHD_FLAGS_DEFAULT_SAMPLE_FLAGS_PRESENT = 0x000020, GST_TFHD_FLAGS_DURATION_IS_EMPTY = 0x010000, GST_TFHD_FLAGS_DEFAULT_BASE_IS_MOOF = 0x020000 } GstTfhdFlags; typedef struct _GstTfhdBox { guint8 version; GstTfhdFlags flags; guint32 track_id; /* optional */ guint64 base_data_offset; guint32 sample_description_index; guint32 default_sample_duration; guint32 default_sample_size; guint32 default_sample_flags; } GstTfhdBox; typedef enum { GST_TRUN_FLAGS_DATA_OFFSET_PRESENT = 0x000001, GST_TRUN_FLAGS_FIRST_SAMPLE_FLAGS_PRESENT = 0x000004, GST_TRUN_FLAGS_SAMPLE_DURATION_PRESENT = 0x000100, GST_TRUN_FLAGS_SAMPLE_SIZE_PRESENT = 0x000200, GST_TRUN_FLAGS_SAMPLE_FLAGS_PRESENT = 0x000400, GST_TRUN_FLAGS_SAMPLE_COMPOSITION_TIME_OFFSETS_PRESENT = 0x000800 } GstTrunFlags; typedef struct _GstTrunBox { guint8 version; GstTrunFlags flags; guint32 sample_count; /* optional */ gint32 data_offset; guint32 first_sample_flags; GArray *samples; } GstTrunBox; typedef struct _GstTrunSample { guint32 sample_duration; guint32 sample_size; guint32 sample_flags; union { guint32 u; /* version 0 */ gint32 s; /* others */ } sample_composition_time_offset; } GstTrunSample; typedef struct _GstTdftBox { guint64 decode_time; } GstTfdtBox; typedef struct _GstTrafBox { GstTfhdBox tfhd; GstTfdtBox tfdt; GArray *trun; /* smooth-streaming specific */ GstTfrfBox *tfrf; GstTfxdBox *tfxd; } GstTrafBox; typedef struct _GstMoofBox { GstMfhdBox mfhd; GArray *traf; } GstMoofBox; GST_ISOFF_API GstMoofBox * gst_isoff_moof_box_parse (GstByteReader *reader); GST_ISOFF_API void gst_isoff_moof_box_free (GstMoofBox *moof); typedef struct _GstTkhdBox { guint32 track_id; } GstTkhdBox; typedef struct _GstMdhdBox { guint32 timescale; } GstMdhdBox; typedef struct _GstHdlrBox { guint32 handler_type; } GstHdlrBox; typedef struct _GstMdiaBox { GstMdhdBox mdhd; GstHdlrBox hdlr; } GstMdiaBox; typedef struct _GstTrakBox { GstTkhdBox tkhd; GstMdiaBox mdia; } GstTrakBox; typedef struct _GstMoovBox { GArray *trak; } GstMoovBox; GST_ISOFF_API GstMoovBox * gst_isoff_moov_box_parse (GstByteReader *reader); GST_ISOFF_API void gst_isoff_moov_box_free (GstMoovBox *moov); typedef struct _GstSidxBoxEntry { gboolean ref_type; guint32 size; GstClockTime duration; gboolean starts_with_sap; guint8 sap_type; guint32 sap_delta_time; guint64 offset; GstClockTime pts; } GstSidxBoxEntry; typedef struct _GstSidxBox { guint8 version; guint32 flags; guint32 ref_id; guint32 timescale; guint64 earliest_pts; guint64 first_offset; gint entry_index; gint entries_count; GstSidxBoxEntry *entries; } GstSidxBox; typedef enum _GstSidxParserStatus { GST_ISOFF_SIDX_PARSER_INIT, GST_ISOFF_SIDX_PARSER_HEADER, GST_ISOFF_SIDX_PARSER_DATA, GST_ISOFF_SIDX_PARSER_FINISHED } GstSidxParserStatus; typedef struct _GstSidxParser { GstSidxParserStatus status; guint64 size; guint64 cumulative_entry_size; guint64 cumulative_pts; GstSidxBox sidx; } GstSidxParser; GST_ISOFF_API void gst_isoff_sidx_parser_init (GstSidxParser * parser); GST_ISOFF_API void gst_isoff_sidx_parser_clear (GstSidxParser * parser); GST_ISOFF_API GstIsoffParserResult gst_isoff_sidx_parser_parse (GstSidxParser * parser, GstByteReader * reader, guint * consumed); GST_ISOFF_API GstIsoffParserResult gst_isoff_sidx_parser_add_buffer (GstSidxParser * parser, GstBuffer * buf, guint * consumed); G_END_DECLS #endif /* __GST_ISOFF_H__ */