Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

132 rindas
4.6KB

  1. #ifndef _mp4_writer_h_
  2. #define _mp4_writer_h_
  3. #include <stddef.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>
  6. #include <assert.h>
  7. #include "mov-buffer.h"
  8. #include "mov-format.h"
  9. #include "mov-writer.h"
  10. #include "fmp4-writer.h"
  11. #ifdef __cplusplus
  12. extern "C" {
  13. #endif
  14. struct mp4_writer_t
  15. {
  16. mov_writer_t *mov;
  17. fmp4_writer_t* fmp4;
  18. };
  19. /// @param[in] flags mov flags, such as: MOV_FLAG_SEGMENT, see more @mov-format.h
  20. static inline struct mp4_writer_t* mp4_writer_create(int is_fmp4, const struct mov_buffer_t* buffer, void* param, int flags)
  21. {
  22. struct mp4_writer_t* mp4;
  23. mp4 = (struct mp4_writer_t*)calloc(1, sizeof(struct mp4_writer_t));
  24. if (!mp4) return NULL;
  25. if (!is_fmp4) {
  26. mp4->mov = mov_writer_create(buffer, param, flags);
  27. } else {
  28. mp4->fmp4 = fmp4_writer_create(buffer, param, flags);
  29. }
  30. return mp4;
  31. }
  32. static inline void mp4_writer_destroy(struct mp4_writer_t* mp4)
  33. {
  34. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  35. if (mp4->mov) {
  36. mov_writer_destroy(mp4->mov);
  37. } else {
  38. fmp4_writer_destroy(mp4->fmp4);
  39. }
  40. free(mp4);
  41. }
  42. /// @param[in] object MPEG-4 systems ObjectTypeIndication such as: MOV_OBJECT_AAC, see more @mov-format.h
  43. /// @param[in] extra_data AudioSpecificConfig
  44. /// @return >=0-track, <0-error
  45. static inline int mp4_writer_add_audio(struct mp4_writer_t* mp4, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size)
  46. {
  47. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  48. if (mp4->mov) {
  49. return mov_writer_add_audio(mp4->mov, object, channel_count, bits_per_sample, sample_rate, extra_data, extra_data_size);
  50. } else {
  51. return fmp4_writer_add_audio(mp4->fmp4, object, channel_count, bits_per_sample, sample_rate, extra_data, extra_data_size);
  52. }
  53. }
  54. /// @param[in] object MPEG-4 systems ObjectTypeIndication such as: MOV_OBJECT_H264, see more @mov-format.h
  55. /// @param[in] extra_data AVCDecoderConfigurationRecord/HEVCDecoderConfigurationRecord
  56. /// @return >=0-track, <0-error
  57. static inline int mp4_writer_add_video(struct mp4_writer_t* mp4, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size)
  58. {
  59. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  60. if (mp4->mov) {
  61. return mov_writer_add_video(mp4->mov, object, width, height, extra_data, extra_data_size);
  62. } else {
  63. return fmp4_writer_add_video(mp4->fmp4, object, width, height, extra_data, extra_data_size);
  64. }
  65. }
  66. static inline int mp4_writer_add_subtitle(struct mp4_writer_t* mp4, uint8_t object, const void* extra_data, size_t extra_data_size)
  67. {
  68. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  69. if (mp4->mov) {
  70. return mov_writer_add_subtitle(mp4->mov, object, extra_data, extra_data_size);
  71. } else {
  72. return fmp4_writer_add_subtitle(mp4->fmp4, object, extra_data, extra_data_size);
  73. }
  74. }
  75. /// Write audio/video stream
  76. /// raw AAC data, don't include ADTS/AudioSpecificConfig
  77. /// H.264/H.265 MP4 format, replace start code(0x00000001) with NALU size
  78. /// @param[in] track return by mov_writer_add_audio/mov_writer_add_video
  79. /// @param[in] data audio/video frame
  80. /// @param[in] bytes buffer size
  81. /// @param[in] pts timestamp in millisecond
  82. /// @param[in] dts timestamp in millisecond
  83. /// @param[in] flags MOV_AV_FLAG_XXX, such as: MOV_AV_FLAG_KEYFREAME, see more @mov-format.h
  84. /// @return 0-ok, other-error
  85. static inline int mp4_writer_write(struct mp4_writer_t* mp4, int track, const void* data, size_t bytes, int64_t pts, int64_t dts, int flags)
  86. {
  87. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  88. if (mp4->mov) {
  89. return mov_writer_write(mp4->mov, track, data, bytes, pts, dts, flags);
  90. } else {
  91. return fmp4_writer_write(mp4->fmp4, track, data, bytes, pts, dts, flags);
  92. }
  93. }
  94. ///////////////////// The following interfaces are only applicable to fmp4 ///////////////////////////////
  95. /// Save data and open next segment
  96. /// @return 0-ok, other-error
  97. static inline int mp4_writer_save_segment(struct mp4_writer_t* mp4)
  98. {
  99. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  100. if (mp4->fmp4)
  101. return fmp4_writer_save_segment(mp4->fmp4);
  102. return 0;
  103. }
  104. /// Get init segment data(write FTYP, MOOV only)
  105. /// WARNING: it caller duty to switch file/buffer context with fmp4_writer_write
  106. /// @return 0-ok, other-error
  107. static inline int mp4_writer_init_segment(struct mp4_writer_t* mp4)
  108. {
  109. assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov));
  110. if (mp4->fmp4)
  111. return fmp4_writer_init_segment(mp4->fmp4);
  112. return 0;
  113. }
  114. #ifdef __cplusplus
  115. }
  116. #endif
  117. #endif /* !_mp4_writer_h_ */