encoder_aac.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #ifndef ENCODER_AAC
  2. #define ENCODER_AAC
  3. #include <atomic>
  4. #include <thread>
  5. #include <functional>
  6. #include <mutex>
  7. #include <condition_variable>
  8. #include "headers_ffmpeg.h"
  9. #include "ring_buffer.h"
  10. //#define SAVE_AAC
  11. namespace am {
  12. typedef std::function<void(AVPacket *packet)> cb_aac_data;
  13. typedef std::function<void(int)> cb_aac_error;
  14. class encoder_aac {
  15. public:
  16. encoder_aac();
  17. ~encoder_aac();
  18. int init(
  19. int nb_channels,
  20. int sample_rate,
  21. AVSampleFormat fmt,
  22. int bit_rate
  23. );
  24. int get_extradata_size();
  25. const uint8_t* get_extradata();
  26. int get_nb_samples();
  27. int start();
  28. void stop();
  29. int put(const uint8_t *data,int data_len,AVFrame *frame);
  30. inline void registe_cb(
  31. cb_aac_data on_data,
  32. cb_aac_error on_error) {
  33. _on_data = on_data;
  34. _on_error = on_error;
  35. }
  36. const AVRational &get_time_base();
  37. AVCodecID get_codec_id();
  38. private:
  39. int encode(AVFrame *frame, AVPacket *packet);
  40. void encode_loop();
  41. void cleanup();
  42. private:
  43. cb_aac_data _on_data;
  44. cb_aac_error _on_error;
  45. ring_buffer<AVFrame> *_ring_buffer;
  46. std::atomic_bool _inited;
  47. std::atomic_bool _running;
  48. std::thread _thread;
  49. AVCodec *_encoder;
  50. AVCodecContext *_encoder_ctx;
  51. AVFrame *_frame;
  52. uint8_t *_buff;
  53. int _buff_size;
  54. std::mutex _mutex;
  55. std::condition_variable _cond_var;
  56. bool _cond_notify;
  57. #ifdef SAVE_AAC
  58. AVIOContext *_aac_io_ctx;
  59. AVStream *_aac_stream;
  60. AVFormatContext *_aac_fmt_ctx;
  61. #endif
  62. };
  63. }
  64. #endif