Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #if defined(__linux__) && defined(__arm__)
- #include "OPENMAX_H264_DECODER.h"
- void Initialize_OPENMAX_H264_DECODER(OPENMAX_H264_DECODER* decoder) {
- decoder->port_settings_changed = 0;
- decoder->first_packet = 1;
- decoder->Buffer = NULL;
- memset(decoder->List, 0, sizeof(decoder->List));
- memset(decoder->Tunnel, 0, sizeof(decoder->Tunnel));
- memset(&decoder->Format, 0, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
- bcm_host_init();
- //why is this zero? who knows...
- decoder->Display = vc_dispmanx_display_open(0);
- if (vc_dispmanx_display_get_info(decoder->Display, &decoder->Info)) {
- return;
- }
- decoder->Width = decoder->Info.width;
- decoder->Height = decoder->Info.height;
- if((decoder->Client = ilclient_init()) == NULL) {
- return;
- }
- if (OMX_Init() != OMX_ErrorNone) {
- ilclient_destroy(decoder->Client);
- return;
- }
- if (
- ilclient_create_component(decoder->Client, &decoder->Video_Decode,
- "video_decode", ILCLIENT_CREATE_FLAGS_T(ILCLIENT_DISABLE_ALL_PORTS |
- ILCLIENT_ENABLE_INPUT_BUFFERS)) != 0) {
- return;
- }
- decoder->List[0] = decoder->Video_Decode;
- if (ilclient_create_component(
- decoder->Client, &decoder->Video_Render, "video_render",
- ILCLIENT_DISABLE_ALL_PORTS) != 0) {
- return;
- }
- decoder->List[1] = decoder->Video_Render;
- set_tunnel(
- decoder->Tunnel, decoder->Video_Decode, 131, decoder->Video_Render, 90);
- ilclient_change_component_state(decoder->Video_Decode, OMX_StateIdle);
- decoder->Format.nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE);
- decoder->Format.nVersion.nVersion = OMX_VERSION;
- decoder->Format.nPortIndex = 130;
- decoder->Format.eCompressionFormat = OMX_VIDEO_CodingAVC;
- if (
- OMX_SetParameter(ILC_GET_HANDLE(decoder->Video_Decode),
- OMX_IndexParamVideoPortFormat, &decoder->Format) == OMX_ErrorNone &&
- ilclient_enable_port_buffers(decoder->Video_Decode, 130, NULL, NULL, NULL)
- == 0) {
- ilclient_change_component_state(
- decoder->Video_Decode, OMX_StateExecuting);
- }
- }
- void Render_H264_Frame(OPENMAX_H264_DECODER* decoder, char* buffer, int size) {
- int process_size = 0;
- while (process_size < size) {
- decoder->Buffer = ilclient_get_input_buffer(
- decoder->Video_Decode, 130, 1);
- if (decoder->Buffer != NULL) {
- // feed data and wait until we get port settings changed
- unsigned char *dest = decoder->Buffer->pBuffer;
- copy(
- buffer + process_size, buffer + process_size +
- (((size - process_size) > decoder->Buffer->nAllocLen) ?
- decoder->Buffer->nAllocLen : (size - process_size)), dest);
- if (decoder->port_settings_changed == 0) {
- if (ilclient_remove_event(decoder->Video_Decode,
- OMX_EventPortSettingsChanged, 131, 0, 0, 1) == 0) {
- decoder->port_settings_changed = 1;
- if(ilclient_setup_tunnel(decoder->Tunnel, 0, 0) != 0) {
- return;
- }
- ilclient_change_component_state(
- decoder->Video_Render, OMX_StateExecuting);
- }
- }
- decoder->Buffer->nFilledLen = (
- ((size - process_size) > decoder->Buffer->nAllocLen) ?
- decoder->Buffer->nAllocLen : (size - process_size));
- process_size += (
- ((size - process_size) > decoder->Buffer->nAllocLen) ?
- decoder->Buffer->nAllocLen : (size - process_size));
- decoder->Buffer->nOffset = 0;
- if(decoder->first_packet) {
- decoder->Buffer->nFlags = OMX_BUFFERFLAG_STARTTIME;
- decoder->first_packet = 0;
- } else {
- decoder->Buffer->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
- }
- if (
- OMX_EmptyThisBuffer(ILC_GET_HANDLE(decoder->Video_Decode),
- decoder->Buffer) != OMX_ErrorNone) {
- return;
- }
- }
- }
- }
- void Delete_OPENMAX_H264_DECODER(OPENMAX_H264_DECODER* decoder) {
- if (decoder->Buffer != NULL) {
- decoder->Buffer->nFilledLen = 0;
- decoder->Buffer->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN |
- OMX_BUFFERFLAG_EOS;
- if (
- OMX_EmptyThisBuffer(ILC_GET_HANDLE(decoder->Video_Decode),
- decoder->Buffer) != OMX_ErrorNone) { }
- ilclient_wait_for_event(
- decoder->Video_Render, OMX_EventBufferFlag, 90, 0, OMX_BUFFERFLAG_EOS,
- 0, ILCLIENT_BUFFER_FLAG_EOS, -1);
- ilclient_flush_tunnels(decoder->Tunnel, 0);
- }
- if (!vc_dispmanx_display_close(decoder->Display)) {}
- ilclient_disable_tunnel(decoder->Tunnel);
- ilclient_disable_port_buffers(decoder->Video_Decode, 130, NULL, NULL, NULL);
- ilclient_teardown_tunnels(decoder->Tunnel);
- ilclient_state_transition(decoder->List, OMX_StateIdle);
- ilclient_state_transition(decoder->List, OMX_StateLoaded);
- ilclient_cleanup_components(decoder->List);
- OMX_Deinit();
- ilclient_destroy(decoder->Client);
- }
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement