0022-FFmpeg-enable-internal-optimize.patch 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. diff --git a/libavcodec/omxdec.c b/libavcodec/omxdec.c
  2. index 1bb08b1..c518542 100755
  3. --- a/libavcodec/omxdec.c
  4. +++ b/libavcodec/omxdec.c
  5. @@ -342,6 +342,8 @@ typedef struct OMXCodecContext {
  6. pthread_cond_t input_cond;
  7. pthread_mutex_t output_mutex;
  8. pthread_cond_t output_cond;
  9. + pthread_mutex_t disableEVnt_mutex;
  10. + pthread_cond_t disableEVnt_cond;
  11. pthread_mutex_t state_mutex;
  12. pthread_cond_t state_cond;
  13. @@ -419,7 +421,7 @@ static OMX_ERRORTYPE event_handler(OMX_HANDLETYPE component, OMX_PTR app_data, O
  14. OMX_PARAM_PORTDEFINITIONTYPE out_port_params = { 0 };
  15. OMX_PORT_PARAM_TYPE video_port_params = { 0 };
  16. OMX_ERRORTYPE err;
  17. - int i;
  18. + int i, num;
  19. switch (event) {
  20. case OMX_EventError:
  21. @@ -438,6 +440,11 @@ static OMX_ERRORTYPE event_handler(OMX_HANDLETYPE component, OMX_PTR app_data, O
  22. pthread_mutex_unlock(&s->state_mutex);
  23. } else if (data1 == OMX_CommandPortDisable) {
  24. av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" disabled\n", (uint32_t) data2);
  25. + if (data2 == 1) {
  26. + pthread_mutex_lock(&s->disableEVnt_mutex);
  27. + pthread_cond_broadcast(&s->disableEVnt_cond);
  28. + pthread_mutex_unlock(&s->disableEVnt_mutex);
  29. + }
  30. } else if (data1 == OMX_CommandPortEnable) {
  31. av_log(s->avctx, AV_LOG_VERBOSE, "OMX port %"PRIu32" enabled\n", (uint32_t) data2);
  32. } else {
  33. @@ -470,6 +477,32 @@ static OMX_ERRORTYPE event_handler(OMX_HANDLETYPE component, OMX_PTR app_data, O
  34. dec_pix_fmt = out_port_params.format.video.eColorFormat;
  35. av_log(s->avctx, AV_LOG_VERBOSE, "w:%d, h:%d, fmt:%d\n", dec_out_width, dec_out_height, dec_pix_fmt);
  36. + if (!s->num_out_buffers) {
  37. + s->num_out_buffers = out_port_params.nBufferCountActual;
  38. + s->out_buffer_headers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_out_buffers);
  39. + s->done_out_buffers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_out_buffers);
  40. +
  41. + if (!s->out_buffer_headers || !s->done_out_buffers)
  42. + return AVERROR(ENOMEM);
  43. +
  44. + OMX_SendCommand(s->handle, OMX_CommandPortEnable, 1, NULL);
  45. +
  46. + for (num = 0; num < s->num_out_buffers && err == OMX_ErrorNone; num++)
  47. + err = OMX_AllocateBuffer(s->handle, &s->out_buffer_headers[num], s->out_port, s, out_port_params.nBufferSize);
  48. +
  49. + if (err != OMX_ErrorNone) {
  50. + av_log(s->avctx, AV_LOG_ERROR, "err %x (%d) on line %d\n", err, err, __LINE__);
  51. + return AVERROR_UNKNOWN;
  52. + }
  53. + s->num_out_buffers = num;
  54. +
  55. + for (num = 0; num < s->num_out_buffers && err == OMX_ErrorNone; num++)
  56. + err = OMX_FillThisBuffer(s->handle, s->out_buffer_headers[num]);
  57. + if (err != OMX_ErrorNone) {
  58. + for (; num < s->num_out_buffers; num++)
  59. + s->done_out_buffers[s->num_done_out_buffers++] = s->out_buffer_headers[num];
  60. + }
  61. + }
  62. }
  63. }
  64. break;
  65. @@ -866,15 +899,18 @@ static av_cold int omx_component_init(AVCodecContext *avctx, const char *role)
  66. CHECK(err);
  67. err = OMX_GetParameter(s->handle, OMX_IndexParamPortDefinition, &out_port_params);
  68. CHECK(err);
  69. - s->num_out_buffers = out_port_params.nBufferCountActual;
  70. +
  71. + OMX_SendCommand(s->handle, OMX_CommandPortDisable, 1, NULL);
  72. + pthread_mutex_lock(&s->disableEVnt_mutex);
  73. + pthread_cond_wait(&s->disableEVnt_cond, &s->disableEVnt_mutex);
  74. + pthread_mutex_unlock(&s->disableEVnt_mutex);
  75. err = OMX_SendCommand(s->handle, OMX_CommandStateSet, OMX_StateIdle, NULL);
  76. CHECK(err);
  77. s->in_buffer_headers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_in_buffers);
  78. s->free_in_buffers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_in_buffers);
  79. - s->out_buffer_headers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_out_buffers);
  80. - s->done_out_buffers = av_mallocz(sizeof(OMX_BUFFERHEADERTYPE*) * s->num_out_buffers);
  81. - if (!s->in_buffer_headers || !s->free_in_buffers || !s->out_buffer_headers || !s->done_out_buffers)
  82. +
  83. + if (!s->in_buffer_headers || !s->free_in_buffers)
  84. return AVERROR(ENOMEM);
  85. for (i = 0; i < s->num_in_buffers && err == OMX_ErrorNone; i++) {
  86. @@ -887,10 +923,7 @@ static av_cold int omx_component_init(AVCodecContext *avctx, const char *role)
  87. }
  88. CHECK(err);
  89. s->num_in_buffers = i;
  90. - for (i = 0; i < s->num_out_buffers && err == OMX_ErrorNone; i++)
  91. - err = OMX_AllocateBuffer(s->handle, &s->out_buffer_headers[i], s->out_port, s, out_port_params.nBufferSize);
  92. - CHECK(err);
  93. - s->num_out_buffers = i;
  94. +
  95. if (wait_for_state(s, OMX_StateIdle) < 0) {
  96. av_log(avctx, AV_LOG_ERROR, "Didn't get OMX_StateIdle\n");
  97. return AVERROR_UNKNOWN;
  98. @@ -901,12 +934,7 @@ static av_cold int omx_component_init(AVCodecContext *avctx, const char *role)
  99. av_log(avctx, AV_LOG_ERROR, "Didn't get OMX_StateExecuting\n");
  100. return AVERROR_UNKNOWN;
  101. }
  102. - for (i = 0; i < s->num_out_buffers && err == OMX_ErrorNone; i++)
  103. - err = OMX_FillThisBuffer(s->handle, s->out_buffer_headers[i]);
  104. - if (err != OMX_ErrorNone) {
  105. - for (; i < s->num_out_buffers; i++)
  106. - s->done_out_buffers[s->num_done_out_buffers++] = s->out_buffer_headers[i];
  107. - }
  108. +
  109. for (i = 0; i < s->num_in_buffers; i++)
  110. s->free_in_buffers[s->num_free_in_buffers++] = s->in_buffer_headers[i];
  111. return err != OMX_ErrorNone ? AVERROR_UNKNOWN : 0;
  112. @@ -952,6 +980,8 @@ static av_cold void cleanup(OMXCodecContext *s)
  113. pthread_mutex_destroy(&s->input_mutex);
  114. pthread_cond_destroy(&s->output_cond);
  115. pthread_mutex_destroy(&s->output_mutex);
  116. + pthread_cond_destroy(&s->disableEVnt_cond);
  117. + pthread_mutex_destroy(&s->disableEVnt_mutex);
  118. s->mutex_cond_inited = 0;
  119. }
  120. OMXDecodeQueueDestory(&s->decode_pts_queue);
  121. @@ -984,6 +1014,8 @@ static av_cold int omx_decode_init(AVCodecContext *avctx)
  122. pthread_cond_init(&s->input_cond, NULL);
  123. pthread_mutex_init(&s->output_mutex, NULL);
  124. pthread_cond_init(&s->output_cond, NULL);
  125. + pthread_mutex_init(&s->disableEVnt_mutex, NULL);
  126. + pthread_cond_init(&s->disableEVnt_cond, NULL);
  127. s->mutex_cond_inited = 1;
  128. s->avctx = avctx;
  129. s->state = OMX_StateLoaded;
  130. @@ -1009,6 +1041,7 @@ static av_cold int omx_decode_init(AVCodecContext *avctx)
  131. if ((ret = find_component(s->omx_context, avctx, role, s->component_name, sizeof(s->component_name))) < 0)
  132. goto fail;
  133. + strcat(s->component_name, ".internal");
  134. av_log(avctx, AV_LOG_INFO, "Using %s\n", s->component_name);