OmxEncoder: use std::vector to keep buffer (#19807)

albatross
Dean Lee 2021-01-18 07:48:06 +08:00 committed by GitHub
parent 297f59c0db
commit e04cecd169
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 23 deletions

View File

@ -212,7 +212,7 @@ OmxEncoder::OmxEncoder(const char* filename, int width, int height, int fps, int
OMX_CHECK(OMX_SetParameter(this->handle, OMX_IndexParamPortDefinition, (OMX_PTR) &in_port));
OMX_CHECK(OMX_GetParameter(this->handle, OMX_IndexParamPortDefinition, (OMX_PTR) &in_port));
this->num_in_bufs = in_port.nBufferCountActual;
this->in_buf_headers.resize(in_port.nBufferCountActual);
// setup output port
@ -234,7 +234,7 @@ OmxEncoder::OmxEncoder(const char* filename, int width, int height, int fps, int
OMX_CHECK(OMX_SetParameter(this->handle, OMX_IndexParamPortDefinition, (OMX_PTR) &out_port));
OMX_CHECK(OMX_GetParameter(this->handle, OMX_IndexParamPortDefinition, (OMX_PTR) &out_port));
this->num_out_bufs = out_port.nBufferCountActual;
this->out_buf_headers.resize(out_port.nBufferCountActual);
OMX_VIDEO_PARAM_BITRATETYPE bitrate_type = {0};
bitrate_type.nSize = sizeof(bitrate_type);
@ -306,15 +306,13 @@ OmxEncoder::OmxEncoder(const char* filename, int width, int height, int fps, int
OMX_CHECK(OMX_SendCommand(this->handle, OMX_CommandStateSet, OMX_StateIdle, NULL));
this->in_buf_headers = (OMX_BUFFERHEADERTYPE **)calloc(this->num_in_bufs, sizeof(OMX_BUFFERHEADERTYPE*));
for (int i=0; i<this->num_in_bufs; i++) {
OMX_CHECK(OMX_AllocateBuffer(this->handle, &this->in_buf_headers[i], PORT_INDEX_IN, this,
for (auto &buf : this->in_buf_headers) {
OMX_CHECK(OMX_AllocateBuffer(this->handle, &buf, PORT_INDEX_IN, this,
in_port.nBufferSize));
}
this->out_buf_headers = (OMX_BUFFERHEADERTYPE **)calloc(this->num_out_bufs, sizeof(OMX_BUFFERHEADERTYPE*));
for (int i=0; i<this->num_out_bufs; i++) {
OMX_CHECK(OMX_AllocateBuffer(this->handle, &this->out_buf_headers[i], PORT_INDEX_OUT, this,
for (auto &buf : this->out_buf_headers) {
OMX_CHECK(OMX_AllocateBuffer(this->handle, &buf, PORT_INDEX_OUT, this,
out_port.nBufferSize));
}
@ -325,14 +323,14 @@ OmxEncoder::OmxEncoder(const char* filename, int width, int height, int fps, int
wait_for_state(OMX_StateExecuting);
// give omx all the output buffers
for (int i = 0; i < this->num_out_bufs; i++) {
for (auto &buf : this->out_buf_headers) {
// printf("fill %p\n", this->out_buf_headers[i]);
OMX_CHECK(OMX_FillThisBuffer(this->handle, this->out_buf_headers[i]));
OMX_CHECK(OMX_FillThisBuffer(this->handle, buf));
}
// fill the input free queue
for (int i = 0; i < this->num_in_bufs; i++) {
queue_push(&this->free_in, (void*)this->in_buf_headers[i]);
for (auto &buf : this->in_buf_headers) {
queue_push(&this->free_in, (void*)buf);
}
}
@ -593,15 +591,13 @@ OmxEncoder::~OmxEncoder() {
OMX_CHECK(OMX_SendCommand(this->handle, OMX_CommandStateSet, OMX_StateLoaded, NULL));
for (int i=0; i<this->num_in_bufs; i++) {
OMX_CHECK(OMX_FreeBuffer(this->handle, PORT_INDEX_IN, this->in_buf_headers[i]));
for (auto &buf : this->in_buf_headers) {
OMX_CHECK(OMX_FreeBuffer(this->handle, PORT_INDEX_IN, buf));
}
free(this->in_buf_headers);
for (int i=0; i<this->num_out_bufs; i++) {
OMX_CHECK(OMX_FreeBuffer(this->handle, PORT_INDEX_OUT, this->out_buf_headers[i]));
for (auto &buf : this->out_buf_headers) {
OMX_CHECK(OMX_FreeBuffer(this->handle, PORT_INDEX_OUT, buf));
}
free(this->out_buf_headers);
wait_for_state(OMX_StateLoaded);

View File

@ -5,6 +5,7 @@
#include <stdbool.h>
#include <pthread.h>
#include <vector>
#include <OMX_Component.h>
extern "C" {
@ -60,11 +61,8 @@ private:
OMX_HANDLETYPE handle;
int num_in_bufs;
OMX_BUFFERHEADERTYPE** in_buf_headers;
int num_out_bufs;
OMX_BUFFERHEADERTYPE** out_buf_headers;
std::vector<OMX_BUFFERHEADERTYPE *> in_buf_headers;
std::vector<OMX_BUFFERHEADERTYPE *> out_buf_headers;
uint64_t last_t;