static int sdl_submit_decode_unit(PDECODE_UNIT decodeUnit) { if (decodeUnit->fullLength < DECODER_BUFFER_SIZE) { PLENTRY entry = decodeUnit->bufferList; int length = 0; while (entry != NULL) { memcpy(ffmpeg_buffer+length, entry->data, entry->length); length += entry->length; entry = entry->next; } int ret = ffmpeg_decode(ffmpeg_buffer, length); if (ret == 1) { AVFrame* frame = ffmpeg_get_frame(); SDL_UpdateYUVTexture(bmp, NULL, frame->data[0], frame->linesize[0], frame->data[1], frame->linesize[1], frame->data[2], frame->linesize[2]); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, bmp, NULL, NULL); SDL_RenderPresent(renderer); } } else { fprintf(stderr, "Video decode buffer too small"); exit(1); } return DR_OK; }
static int sdl_submit_decode_unit(PDECODE_UNIT decodeUnit) { if (decodeUnit->fullLength < DECODER_BUFFER_SIZE) { PLENTRY entry = decodeUnit->bufferList; int length = 0; while (entry != NULL) { memcpy(ffmpeg_buffer+length, entry->data, entry->length); length += entry->length; entry = entry->next; } if (SDL_LockMutex(mutex) == 0) { int ret = ffmpeg_decode(ffmpeg_buffer, length); if (ret == 1) { AVFrame* frame = ffmpeg_get_frame(); SDL_Event event; event.type = SDL_USEREVENT; event.user.code = SDL_CODE_FRAME; event.user.data1 = &frame->data; event.user.data2 = &frame->linesize; SDL_PushEvent(&event); } SDL_UnlockMutex(mutex); } else fprintf(stderr, "Couldn't lock mutex\n"); } else { fprintf(stderr, "Video decode buffer too small"); exit(1); } return DR_OK; }