1/* 2 * "NUT" Container Format (de)muxer 3 * Copyright (c) 2006 Michael Niedermayer 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#ifndef AVFORMAT_NUT_H 23#define AVFORMAT_NUT_H 24 25//#include <limits.h> 26//#include "libavutil/adler32.h" 27//#include "libavcodec/mpegaudio.h" 28#include "avformat.h" 29#include "riff.h" 30#include "metadata.h" 31 32#define MAIN_STARTCODE (0x7A561F5F04ADULL + (((uint64_t)('N'<<8) + 'M')<<48)) 33#define STREAM_STARTCODE (0x11405BF2F9DBULL + (((uint64_t)('N'<<8) + 'S')<<48)) 34#define SYNCPOINT_STARTCODE (0xE4ADEECA4569ULL + (((uint64_t)('N'<<8) + 'K')<<48)) 35#define INDEX_STARTCODE (0xDD672F23E64EULL + (((uint64_t)('N'<<8) + 'X')<<48)) 36#define INFO_STARTCODE (0xAB68B596BA78ULL + (((uint64_t)('N'<<8) + 'I')<<48)) 37 38#define ID_STRING "nut/multimedia container\0" 39 40#define MAX_DISTANCE (1024*32-1) 41 42typedef enum{ 43 FLAG_KEY = 1, ///<if set, frame is keyframe 44 FLAG_EOR = 2, ///<if set, stream has no relevance on presentation. (EOR) 45 FLAG_CODED_PTS = 8, ///<if set, coded_pts is in the frame header 46 FLAG_STREAM_ID = 16, ///<if set, stream_id is coded in the frame header 47 FLAG_SIZE_MSB = 32, ///<if set, data_size_msb is at frame header, otherwise data_size_msb is 0 48 FLAG_CHECKSUM = 64, ///<if set, the frame header contains a checksum 49 FLAG_RESERVED = 128, ///<if set, reserved_count is coded in the frame header 50 FLAG_HEADER_IDX =1024, ///<If set, header_idx is coded in the frame header. 51 FLAG_MATCH_TIME =2048, ///<If set, match_time_delta is coded in the frame header 52 FLAG_CODED =4096, ///<if set, coded_flags are stored in the frame header 53 FLAG_INVALID =8192, ///<if set, frame_code is invalid 54} Flag; 55 56typedef struct { 57 uint64_t pos; 58 uint64_t back_ptr; 59// uint64_t global_key_pts; 60 int64_t ts; 61} Syncpoint; 62 63typedef struct { 64 uint16_t flags; 65 uint8_t stream_id; 66 uint16_t size_mul; 67 uint16_t size_lsb; 68 int16_t pts_delta; 69 uint8_t reserved_count; 70 uint8_t header_idx; 71} FrameCode; 72 73typedef struct { 74 int last_flags; 75 int skip_until_key_frame; 76 int64_t last_pts; 77 int time_base_id; 78 AVRational *time_base; 79 int msb_pts_shift; 80 int max_pts_distance; 81 int decode_delay; //FIXME duplicate of has_b_frames 82} StreamContext; 83 84typedef struct { 85 AVFormatContext *avf; 86// int written_packet_size; 87// int64_t packet_start; 88 FrameCode frame_code[256]; 89 uint8_t header_len[128]; 90 const uint8_t *header[128]; 91 uint64_t next_startcode; ///< stores the next startcode if it has already been parsed but the stream is not seekable 92 StreamContext *stream; 93 unsigned int max_distance; 94 unsigned int time_base_count; 95 int64_t last_syncpoint_pos; 96 int header_count; 97 AVRational *time_base; 98 struct AVTreeNode *syncpoints; 99} NUTContext; 100 101extern const AVCodecTag ff_nut_subtitle_tags[]; 102 103typedef struct { 104 char str[9]; 105 int flag; 106} Dispositions; 107 108void ff_nut_reset_ts(NUTContext *nut, AVRational time_base, int64_t val); 109int64_t ff_lsb2full(StreamContext *stream, int64_t lsb); 110int ff_nut_sp_pos_cmp(const Syncpoint *a, const Syncpoint *b); 111int ff_nut_sp_pts_cmp(const Syncpoint *a, const Syncpoint *b); 112void ff_nut_add_sp(NUTContext *nut, int64_t pos, int64_t back_ptr, int64_t ts); 113void ff_nut_free_sp(NUTContext *nut); 114 115extern const Dispositions ff_nut_dispositions[]; 116 117extern const AVMetadataConv ff_nut_metadata_conv[]; 118 119#endif /* AVFORMAT_NUT_H */ 120