/src/flv.h

https://code.google.com/ · C++ Header · 202 lines · 133 code · 33 blank · 36 comment · 0 complexity · 8c66c425d13f4a80ccded8ca2d5e0565 MD5 · raw file

  1. /*
  2. $Id: flv.h 231 2011-06-27 13:46:19Z marc.noirot $
  3. FLV Metadata updater
  4. Copyright (C) 2007-2012 Marc Noirot <marc.noirot AT gmail.com>
  5. This file is part of FLVMeta.
  6. FLVMeta is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. FLVMeta is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with FLVMeta; if not, write to the Free Software
  16. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. */
  18. #ifndef __FLV_H__
  19. #define __FLV_H__
  20. /* Configuration of the sources */
  21. #ifdef HAVE_CONFIG_H
  22. # include <config.h>
  23. #endif
  24. #include "types.h"
  25. #include "amf.h"
  26. /* error statuses */
  27. #define FLV_OK 0
  28. #define FLV_ERROR_OPEN_READ 1
  29. #define FLV_ERROR_NO_FLV 2
  30. #define FLV_ERROR_EOF 3
  31. #define FLV_ERROR_MEMORY 4
  32. #define FLV_ERROR_EMPTY_TAG 5
  33. #define FLV_ERROR_INVALID_METADATA_NAME 6
  34. #define FLV_ERROR_INVALID_METADATA 7
  35. /* flv file format structure and definitions */
  36. /* FLV file header */
  37. #define FLV_SIGNATURE "FLV"
  38. #define FLV_VERSION ((uint8)0x01)
  39. #define FLV_FLAG_VIDEO ((uint8)0x01)
  40. #define FLV_FLAG_AUDIO ((uint8)0x04)
  41. typedef struct __flv_header {
  42. byte signature[3]; /* always "FLV" */
  43. uint8 version; /* should be 1 */
  44. uint8_bitmask flags;
  45. uint32_be offset; /* always 9 */
  46. } flv_header;
  47. #define FLV_HEADER_SIZE 9
  48. #define flv_header_has_video(header) ((header).flags & FLV_FLAG_VIDEO)
  49. #define flv_header_has_audio(header) ((header).flags & FLV_FLAG_AUDIO)
  50. #define flv_header_get_offset(header) (swap_uint32((header).offset))
  51. /* FLV tag */
  52. #define FLV_TAG_TYPE_AUDIO ((uint8)0x08)
  53. #define FLV_TAG_TYPE_VIDEO ((uint8)0x09)
  54. #define FLV_TAG_TYPE_META ((uint8)0x12)
  55. typedef struct __flv_tag {
  56. uint8 type;
  57. uint24_be body_length; /* in bytes, total tag size minus 11 */
  58. uint24_be timestamp; /* milli-seconds */
  59. uint8 timestamp_extended; /* timestamp extension */
  60. uint24_be stream_id; /* reserved, must be "\0\0\0" */
  61. /* body comes next */
  62. } flv_tag;
  63. #define FLV_TAG_SIZE 11
  64. #define flv_tag_get_body_length(tag) (uint24_be_to_uint32((tag).body_length))
  65. #define flv_tag_get_timestamp(tag) \
  66. (uint24_be_to_uint32((tag).timestamp) + ((tag).timestamp_extended << 24))
  67. #define flv_tag_get_stream_id(tag) (uint24_be_to_uint32((tag).stream_id))
  68. /* audio tag */
  69. #define FLV_AUDIO_TAG_SOUND_TYPE_MONO 0
  70. #define FLV_AUDIO_TAG_SOUND_TYPE_STEREO 1
  71. #define FLV_AUDIO_TAG_SOUND_SIZE_8 0
  72. #define FLV_AUDIO_TAG_SOUND_SIZE_16 1
  73. #define FLV_AUDIO_TAG_SOUND_RATE_5_5 0
  74. #define FLV_AUDIO_TAG_SOUND_RATE_11 1
  75. #define FLV_AUDIO_TAG_SOUND_RATE_22 2
  76. #define FLV_AUDIO_TAG_SOUND_RATE_44 3
  77. #define FLV_AUDIO_TAG_SOUND_FORMAT_LINEAR_PCM 0
  78. #define FLV_AUDIO_TAG_SOUND_FORMAT_ADPCM 1
  79. #define FLV_AUDIO_TAG_SOUND_FORMAT_MP3 2
  80. #define FLV_AUDIO_TAG_SOUND_FORMAT_LINEAR_PCM_LE 3
  81. #define FLV_AUDIO_TAG_SOUND_FORMAT_NELLYMOSER_16_MONO 4
  82. #define FLV_AUDIO_TAG_SOUND_FORMAT_NELLYMOSER_8_MONO 5
  83. #define FLV_AUDIO_TAG_SOUND_FORMAT_NELLYMOSER 6
  84. #define FLV_AUDIO_TAG_SOUND_FORMAT_G711_A 7
  85. #define FLV_AUDIO_TAG_SOUND_FORMAT_G711_MU 8
  86. #define FLV_AUDIO_TAG_SOUND_FORMAT_RESERVED 9
  87. #define FLV_AUDIO_TAG_SOUND_FORMAT_AAC 10
  88. #define FLV_AUDIO_TAG_SOUND_FORMAT_SPEEX 11
  89. #define FLV_AUDIO_TAG_SOUND_FORMAT_MP3_8 14
  90. #define FLV_AUDIO_TAG_SOUND_FORMAT_DEVICE_SPECIFIC 15
  91. typedef byte flv_audio_tag;
  92. #define flv_audio_tag_sound_type(tag) (((tag) & 0x01) >> 0)
  93. #define flv_audio_tag_sound_size(tag) (((tag) & 0x02) >> 1)
  94. #define flv_audio_tag_sound_rate(tag) (((tag) & 0x0C) >> 2)
  95. #define flv_audio_tag_sound_format(tag) (((tag) & 0xF0) >> 4)
  96. /* video tag */
  97. #define FLV_VIDEO_TAG_CODEC_JPEG 1
  98. #define FLV_VIDEO_TAG_CODEC_SORENSEN_H263 2
  99. #define FLV_VIDEO_TAG_CODEC_SCREEN_VIDEO 3
  100. #define FLV_VIDEO_TAG_CODEC_ON2_VP6 4
  101. #define FLV_VIDEO_TAG_CODEC_ON2_VP6_ALPHA 5
  102. #define FLV_VIDEO_TAG_CODEC_SCREEN_VIDEO_V2 6
  103. #define FLV_VIDEO_TAG_CODEC_AVC 7
  104. #define FLV_VIDEO_TAG_FRAME_TYPE_KEYFRAME 1
  105. #define FLV_VIDEO_TAG_FRAME_TYPE_INTERFRAME 2
  106. #define FLV_VIDEO_TAG_FRAME_TYPE_DISPOSABLE_INTERFRAME 3
  107. #define FLV_VIDEO_TAG_FRAME_TYPE_GENERATED_KEYFRAME 4
  108. #define FLV_VIDEO_TAG_FRAME_TYPE_COMMAND_FRAME 5
  109. typedef byte flv_video_tag;
  110. #define flv_video_tag_codec_id(tag) (((tag) & 0x0F) >> 0)
  111. #define flv_video_tag_frame_type(tag) (((tag) & 0xF0) >> 4)
  112. #ifdef __cplusplus
  113. extern "C" {
  114. #endif /* __cplusplus */
  115. /* FLV helper functions */
  116. void flv_tag_set_timestamp(flv_tag * tag, uint32 timestamp);
  117. /* FLV stream */
  118. #define FLV_STREAM_STATE_START 0
  119. #define FLV_STREAM_STATE_TAG 1
  120. #define FLV_STREAM_STATE_TAG_BODY 2
  121. #define FLV_STREAM_STATE_PREV_TAG_SIZE 3
  122. typedef struct __flv_stream {
  123. FILE * flvin;
  124. uint8 state;
  125. flv_tag current_tag;
  126. file_offset_t current_tag_offset;
  127. uint32 current_tag_body_length;
  128. uint32 current_tag_body_overflow;
  129. } flv_stream;
  130. /* FLV stream functions */
  131. flv_stream * flv_open(const char * file);
  132. int flv_read_header(flv_stream * stream, flv_header * header);
  133. int flv_read_prev_tag_size(flv_stream * stream, uint32 * prev_tag_size);
  134. int flv_read_tag(flv_stream * stream, flv_tag * tag);
  135. int flv_read_audio_tag(flv_stream * stream, flv_audio_tag * tag);
  136. int flv_read_video_tag(flv_stream * stream, flv_video_tag * tag);
  137. int flv_read_metadata(flv_stream * stream, amf_data ** name, amf_data ** data);
  138. size_t flv_read_tag_body(flv_stream * stream, void * buffer, size_t buffer_size);
  139. file_offset_t flv_get_current_tag_offset(flv_stream * stream);
  140. file_offset_t flv_get_offset(flv_stream * stream);
  141. void flv_reset(flv_stream * stream);
  142. void flv_close(flv_stream * stream);
  143. /* FLV stdio writing helper functions */
  144. size_t flv_write_header(FILE * out, const flv_header * header);
  145. size_t flv_write_tag(FILE * out, const flv_tag * tag);
  146. /* FLV event based parser */
  147. typedef struct __flv_parser {
  148. flv_stream * stream;
  149. void * user_data;
  150. int (* on_header)(flv_header * header, struct __flv_parser * parser);
  151. int (* on_tag)(flv_tag * tag, struct __flv_parser * parser);
  152. int (* on_metadata_tag)(flv_tag * tag, amf_data * name, amf_data * data, struct __flv_parser * parser);
  153. int (* on_audio_tag)(flv_tag * tag, flv_audio_tag audio_tag, struct __flv_parser * parser);
  154. int (* on_video_tag)(flv_tag * tag, flv_video_tag audio_tag, struct __flv_parser * parser);
  155. int (* on_unknown_tag)(flv_tag * tag, struct __flv_parser * parser);
  156. int (* on_prev_tag_size)(uint32 size, struct __flv_parser * parser);
  157. int (* on_stream_end)(struct __flv_parser * parser);
  158. } flv_parser;
  159. int flv_parse(const char * file, flv_parser * parser);
  160. #ifdef __cplusplus
  161. }
  162. #endif /* __cplusplus */
  163. #endif /* __FLV_H__ */