ffmpeg_mux.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*
  2. * Muxer internal APIs - should not be included outside of ffmpeg_mux*
  3. *
  4. * This file is part of FFmpeg.
  5. *
  6. * FFmpeg is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * FFmpeg is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with FFmpeg; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #ifndef FFTOOLS_FFMPEG_MUX_H
  21. #define FFTOOLS_FFMPEG_MUX_H
  22. #include <stdatomic.h>
  23. #include <stdint.h>
  24. #include "ffmpeg_sched.h"
  25. #include "libavformat/avformat.h"
  26. #include "libavcodec/packet.h"
  27. #include "libavutil/dict.h"
  28. #include "libavutil/fifo.h"
  29. typedef struct MuxStream {
  30. OutputStream ost;
  31. // name used for logging
  32. char log_name[32];
  33. AVBSFContext *bsf_ctx;
  34. AVPacket *bsf_pkt;
  35. AVPacket *pkt;
  36. EncStats stats;
  37. int sch_idx;
  38. int sch_idx_enc;
  39. int sch_idx_src;
  40. int sq_idx_mux;
  41. int64_t max_frames;
  42. // timestamp from which the streamcopied streams should start,
  43. // in AV_TIME_BASE_Q;
  44. // everything before it should be discarded
  45. int64_t ts_copy_start;
  46. /* dts of the last packet sent to the muxer, in the stream timebase
  47. * used for making up missing dts values */
  48. int64_t last_mux_dts;
  49. int64_t stream_duration;
  50. AVRational stream_duration_tb;
  51. // state for av_rescale_delta() call for audio in write_packet()
  52. int64_t ts_rescale_delta_last;
  53. // combined size of all the packets sent to the muxer
  54. uint64_t data_size_mux;
  55. int copy_initial_nonkeyframes;
  56. int copy_prior_start;
  57. int streamcopy_started;
  58. #if FFMPEG_OPT_VSYNC_DROP
  59. int ts_drop;
  60. #endif
  61. char *apad;
  62. } MuxStream;
  63. typedef struct Muxer {
  64. OutputFile of;
  65. // name used for logging
  66. char log_name[32];
  67. AVFormatContext *fc;
  68. Scheduler *sch;
  69. unsigned sch_idx;
  70. // OutputStream indices indexed by scheduler stream indices
  71. int *sch_stream_idx;
  72. int nb_sch_stream_idx;
  73. AVDictionary *opts;
  74. // used to validate that all encoder avoptions have been actually used
  75. AVDictionary *enc_opts_used;
  76. /* filesize limit expressed in bytes */
  77. int64_t limit_filesize;
  78. atomic_int_least64_t last_filesize;
  79. int header_written;
  80. SyncQueue *sq_mux;
  81. AVPacket *sq_pkt;
  82. } Muxer;
  83. int mux_check_init(void *arg);
  84. static MuxStream *ms_from_ost(OutputStream *ost)
  85. {
  86. return (MuxStream*)ost;
  87. }
  88. #endif /* FFTOOLS_FFMPEG_MUX_H */