libcaption
Loading...
Searching...
No Matches
flv.h
Go to the documentation of this file.
1/**********************************************************************************************/
2/* The MIT License */
3/* */
4/* Copyright 2016-2017 Twitch Interactive, Inc. or its affiliates. All Rights Reserved. */
5/* */
6/* Permission is hereby granted, free of charge, to any person obtaining a copy */
7/* of this software and associated documentation files (the "Software"), to deal */
8/* in the Software without restriction, including without limitation the rights */
9/* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell */
10/* copies of the Software, and to permit persons to whom the Software is */
11/* furnished to do so, subject to the following conditions: */
12/* */
13/* The above copyright notice and this permission notice shall be included in */
14/* all copies or substantial portions of the Software. */
15/* */
16/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR */
17/* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, */
18/* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE */
19/* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */
20/* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, */
21/* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN */
22/* THE SOFTWARE. */
23/**********************************************************************************************/
24#ifndef LIBCAPTION_FLV_H
25#define LIBCAPTION_FLV_H
26
27#include <inttypes.h>
28#include <stddef.h>
29#include <stdio.h>
30#define FLV_HEADER_SIZE 13
31#define FLV_FOOTER_SIZE 4
32#define FLV_TAG_HEADER_SIZE 11
33#define FLV_TAG_FOOTER_SIZE 4
35#include "avc.h"
37typedef struct {
38 uint8_t* data;
39 size_t aloc;
40} flvtag_t;
41
42void flvtag_init(flvtag_t* tag);
43void flvtag_free(flvtag_t* tag);
44void flvtag_swap(flvtag_t* tag1, flvtag_t* tag2);
51
52static inline flvtag_type_t flvtag_type(flvtag_t* tag) { return (flvtag_type_t)tag->data[0] & 0x1F; }
71
83
84static inline flvtag_codecid_t flvtag_codecid(flvtag_t* tag) { return (flvtag_type_video != flvtag_type(tag)) ? (flvtag_codecid_unknown) : (tag->data[11] & 0x0F); }
94
95static inline flvtag_frametype_t flvtag_frametype(flvtag_t* tag) { return (flvtag_type_video != flvtag_type(tag)) ? flvtag_frametype_keyframe : ((tag->data[11] >> 4) & 0x0F); }
103
106static inline size_t flvtag_size(flvtag_t* tag) { return (tag->data[1] << 16) | (tag->data[2] << 8) | tag->data[3]; }
107static inline uint32_t flvtag_timestamp(flvtag_t* tag) { return (tag->data[7] << 24) | (tag->data[4] << 16) | (tag->data[5] << 8) | tag->data[6]; }
108static inline uint32_t flvtag_dts(flvtag_t* tag) { return flvtag_timestamp(tag); }
109static inline uint32_t flvtag_cts(flvtag_t* tag) { return (flvtag_avcpackettype_nalu != flvtag_avcpackettype(tag)) ? 0 : (tag->data[13] << 16) | (tag->data[14] << 8) | tag->data[15]; }
110static inline uint32_t flvtag_pts(flvtag_t* tag) { return flvtag_dts(tag) + flvtag_cts(tag); }
111static inline double flvtag_dts_seconds(flvtag_t* tag) { return flvtag_dts(tag) / 1000.0; }
112static inline double flvtag_cts_seconds(flvtag_t* tag) { return flvtag_cts(tag) / 1000.0; }
113static inline double flvtag_pts_seconds(flvtag_t* tag) { return flvtag_pts(tag) / 1000.0; }
115size_t flvtag_header_size(flvtag_t* tag);
116size_t flvtag_payload_size(flvtag_t* tag);
117uint8_t* flvtag_payload_data(flvtag_t* tag);
119FILE* flv_open_read(const char* flv);
120FILE* flv_open_write(const char* flv);
121FILE* flv_close(FILE* flv);
123static inline const uint8_t* flvtag_raw_data(flvtag_t* tag) { return tag->data; }
124static inline const size_t flvtag_raw_size(flvtag_t* tag) { return flvtag_size(tag) + FLV_TAG_HEADER_SIZE + FLV_TAG_FOOTER_SIZE; }
126int flv_read_tag(FILE* flv, flvtag_t* tag);
127int flv_write_tag(FILE* flv, flvtag_t* tag);
128int flv_read_header(FILE* flv, int* has_audio, int* has_video);
129int flv_write_header(FILE* flv, int has_audio, int has_video);
131// If the tage has more that on sei message, they will be combined into one
132sei_t* flv_read_sei(FILE* flv, flvtag_t* tag);
134int flvtag_initavc(flvtag_t* tag, uint32_t dts, int32_t cts, flvtag_frametype_t type);
135int flvtag_avcwritenal(flvtag_t* tag, uint8_t* data, size_t size);
136int flvtag_addcaption_scc(flvtag_t* tag, const scc_t* scc);
137int flvtag_addcaption_text(flvtag_t* tag, const utf8_char_t* text);
139int flvtag_amfcaption_708(flvtag_t* tag, uint32_t timestamp, sei_message_t* msg);
141// This method is expermental, and not currently available on Twitch
142int flvtag_amfcaption_utf8(flvtag_t* tag, uint32_t timestamp, const utf8_char_t* text);
143#endif
static double flvtag_cts_seconds(flvtag_t *tag)
Definition flv.h:112
size_t flvtag_payload_size(flvtag_t *tag)
Definition flv.c:150
int flvtag_addcaption_text(flvtag_t *tag, const utf8_char_t *text)
Definition flv.c:386
static flvtag_type_t flvtag_type(flvtag_t *tag)
Definition flv.h:52
void flvtag_free(flvtag_t *tag)
Definition flv.c:33
static uint32_t flvtag_cts(flvtag_t *tag)
Definition flv.h:109
sei_t * flv_read_sei(FILE *flv, flvtag_t *tag)
static uint32_t flvtag_pts(flvtag_t *tag)
Definition flv.h:110
FILE * flv_open_read(const char *flv)
Definition flv.c:61
int flvtag_amfcaption_708(flvtag_t *tag, uint32_t timestamp, sei_message_t *msg)
Definition flv.c:260
static flvtag_codecid_t flvtag_codecid(flvtag_t *tag)
Definition flv.h:84
FILE * flv_close(FILE *flv)
Definition flv.c:79
static flvtag_soundformat_t flvtag_soundformat(flvtag_t *tag)
Definition flv.h:72
static double flvtag_dts_seconds(flvtag_t *tag)
Definition flv.h:111
flvtag_codecid_t
Definition flv.h:74
@ flvtag_codecid_avc
Definition flv.h:81
@ flvtag_codecid_screenvideoversion2
Definition flv.h:80
@ flvtag_codecid_unknown
Definition flv.h:75
@ flvtag_codecid_sorensonh263
Definition flv.h:76
@ flvtag_codecid_on2vp6
Definition flv.h:78
@ flvtag_codecid_screenvideo
Definition flv.h:77
@ flvtag_codecid_on2vp6withalphachannel
Definition flv.h:79
static flvtag_frametype_t flvtag_frametype(flvtag_t *tag)
Definition flv.h:95
#define FLV_TAG_FOOTER_SIZE
Definition flv.h:33
flvtag_avcpackettype_t
Definition flv.h:97
@ flvtag_avcpackettype_sequenceheader
Definition flv.h:99
@ flvtag_avcpackettype_endofsequence
Definition flv.h:101
@ flvtag_avcpackettype_unknown
Definition flv.h:98
@ flvtag_avcpackettype_nalu
Definition flv.h:100
int flv_read_tag(FILE *flv, flvtag_t *tag)
Definition flv.c:108
static flvtag_avcpackettype_t flvtag_avcpackettype(flvtag_t *tag)
Definition flv.h:104
int flv_write_header(FILE *flv, int has_audio, int has_video)
Definition flv.c:102
flvtag_type_t
Definition flv.h:46
@ flvtag_type_video
Definition flv.h:48
@ flvtag_type_audio
Definition flv.h:47
@ flvtag_type_scriptdata
Definition flv.h:49
FILE * flv_open_write(const char *flv)
Definition flv.c:70
static const uint8_t * flvtag_raw_data(flvtag_t *tag)
Definition flv.h:123
void flvtag_swap(flvtag_t *tag1, flvtag_t *tag2)
Definition flv.c:42
int flvtag_addcaption_scc(flvtag_t *tag, const scc_t *scc)
Definition flv.c:405
int flvtag_avcwritenal(flvtag_t *tag, uint8_t *data, size_t size)
Definition flv.c:316
int flv_read_header(FILE *flv, int *has_audio, int *has_video)
Definition flv.c:85
#define FLV_TAG_HEADER_SIZE
Definition flv.h:32
int flvtag_initavc(flvtag_t *tag, uint32_t dts, int32_t cts, flvtag_frametype_t type)
Definition flv.c:175
static double flvtag_pts_seconds(flvtag_t *tag)
Definition flv.h:113
static uint32_t flvtag_timestamp(flvtag_t *tag)
Definition flv.h:107
flvtag_soundformat_t
Definition flv.h:54
@ flvtag_soundformat_linearpcmplatformendian
Definition flv.h:56
@ flvtag_soundformat_unknown
Definition flv.h:55
@ flvtag_soundformat_devicespecificsound
Definition flv.h:69
@ flvtag_soundformat_mp3
Definition flv.h:58
@ flvtag_soundformat_nellymoser_8khzmono
Definition flv.h:61
@ flvtag_soundformat_nellymoser
Definition flv.h:62
@ flvtag_soundformat_g711alawlogarithmicpcm
Definition flv.h:63
@ flvtag_soundformat_aac
Definition flv.h:66
@ flvtag_soundformat_speex
Definition flv.h:67
@ flvtag_soundformat_nellymoser_16khzmono
Definition flv.h:60
@ flvtag_soundformat_linearpcmlittleendian
Definition flv.h:59
@ flvtag_soundformat_mp3_8khz
Definition flv.h:68
@ flvtag_soundformat_reserved
Definition flv.h:65
@ flvtag_soundformat_adpcm
Definition flv.h:57
@ flvtag_soundformat_g711mulawlogarithmicpcm
Definition flv.h:64
flvtag_frametype_t
Definition flv.h:86
@ flvtag_frametype_keyframe
Definition flv.h:88
@ flvtag_frametype_unknown
Definition flv.h:87
@ flvtag_frametype_disposableinterframe
Definition flv.h:90
@ flvtag_frametype_interframe
Definition flv.h:89
@ flvtag_frametype_commandframe
Definition flv.h:92
@ flvtag_frametype_generatedkeyframe
Definition flv.h:91
int flv_write_tag(FILE *flv, flvtag_t *tag)
Definition flv.c:129
uint8_t * flvtag_payload_data(flvtag_t *tag)
Definition flv.c:155
void flvtag_init(flvtag_t *tag)
Definition flv.c:28
int flvtag_amfcaption_utf8(flvtag_t *tag, uint32_t timestamp, const utf8_char_t *text)
Definition flv.c:289
size_t flvtag_header_size(flvtag_t *tag)
Definition flv.c:135
static const size_t flvtag_raw_size(flvtag_t *tag)
Definition flv.h:124
static uint32_t flvtag_dts(flvtag_t *tag)
Definition flv.h:108
static size_t flvtag_size(flvtag_t *tag)
Definition flv.h:106
Definition flv.h:37
size_t aloc
Definition flv.h:39
uint8_t * data
Definition flv.h:38