예제 #1
0
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;
}
예제 #2
0
파일: ffmpeg.c 프로젝트: vchimishuk/chub
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;
}
예제 #4
0
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);
}