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; }
int ffmpeg_read(struct ffmpeg_file *file, char *buf, int len) { int wrote = 0; while (len - wrote > 0) { if (file->buf == NULL || file->buf_len - file->buf_offset == 0) { for (int i = 0; ; i++) { int n = ffmpeg_decode(file); if (n < 0) { ffmpeg_reset_pkt(file); if (i >= 3) { return n; } } else { break; } } } if (file->buf_len - file->buf_offset > 0) { int n = MIN(len - wrote, file->buf_len - file->buf_offset); memcpy(buf + wrote, file->buf[0] + file->buf_offset, n); file->buf_offset += n; wrote += n; } } return wrote; }
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; }
BOOL freerdp_dsp_ffmpeg_decode(FREERDP_DSP_CONTEXT* context, const AUDIO_FORMAT* srcFormat, const BYTE* data, size_t length, wStream* out) { if (!context || !srcFormat || !data || !out || context->encoder) return FALSE; av_init_packet(context->packet); context->packet->data = data; context->packet->size = length; return ffmpeg_decode(context->context, context->packet, context->frame, context->rcontext, context->resampled, out); }