encoder_video.cpp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "encoder_video.h"
  2. namespace am {
  3. encoder_video::encoder_video()
  4. {
  5. _inited = false;
  6. _running = false;
  7. _time_base = { 0,AV_TIME_BASE };
  8. _encoder_id = EID_VIDEO_X264;
  9. _encoder_type = ET_VIDEO_SOFT;
  10. _cond_notify = false;
  11. _ring_buffer = new ring_buffer<AVFrame>();
  12. }
  13. encoder_video::~encoder_video()
  14. {
  15. if(_ring_buffer)
  16. delete _ring_buffer;
  17. }
  18. int encoder_video::start()
  19. {
  20. int error = AE_NO;
  21. if (_running == true) {
  22. return error;
  23. }
  24. if (_inited == false) {
  25. return AE_NEED_INIT;
  26. }
  27. _running = true;
  28. _thread = std::thread(std::bind(&encoder_video::encode_loop, this));
  29. return error;
  30. }
  31. void encoder_video::stop()
  32. {
  33. _running = false;
  34. _cond_notify = true;
  35. _cond_var.notify_all();
  36. if (_thread.joinable())
  37. _thread.join();
  38. }
  39. int encoder_video::put(const uint8_t * data, int data_len, AVFrame * frame)
  40. {
  41. std::unique_lock<std::mutex> lock(_mutex);
  42. AVFrame frame_cp;
  43. memcpy(&frame_cp, frame, sizeof(AVFrame));
  44. _ring_buffer->put(data, data_len, frame_cp);
  45. _cond_notify = true;
  46. _cond_var.notify_all();
  47. return 0;
  48. }
  49. }