diff options
author | Minghai Shang <minghai@google.com> | 2014-03-19 11:06:20 -0700 |
---|---|---|
committer | Minghai Shang <minghai@google.com> | 2014-03-19 11:06:20 -0700 |
commit | d205335060940b527639a69a2ea15eaaf263a821 (patch) | |
tree | 48f65bc1a8697907ee0e779d5fe3eb28fa4373d5 /vpx/src/svc_encodeframe.c | |
parent | 39f95de83dd8cbdb42c84453f37bedab9ca8242d (diff) | |
download | libvpx-d205335060940b527639a69a2ea15eaaf263a821.tar libvpx-d205335060940b527639a69a2ea15eaaf263a821.tar.gz libvpx-d205335060940b527639a69a2ea15eaaf263a821.tar.bz2 libvpx-d205335060940b527639a69a2ea15eaaf263a821.zip |
[svc] Finalize spatial svc first pass rate control
1. Save stats for each spatial layer
2. Add frame buffer management for svc first pass rc
3. Set default spatial layer to 1
4. Flush encoder at the end of stream in test app
This only supports spatial svc.
Change-Id: Ia89cfa87bb6394e6c0405b921d86c426d0a0c9ae
Diffstat (limited to 'vpx/src/svc_encodeframe.c')
-rw-r--r-- | vpx/src/svc_encodeframe.c | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/vpx/src/svc_encodeframe.c b/vpx/src/svc_encodeframe.c index 4f3f7ec87..d48a761ff 100644 --- a/vpx/src/svc_encodeframe.c +++ b/vpx/src/svc_encodeframe.c @@ -850,7 +850,7 @@ vpx_codec_err_t vpx_svc_encode(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, struct LayerData *layer_data; struct Superframe superframe; SvcInternal *const si = get_svc_internal(svc_ctx); - if (svc_ctx == NULL || codec_ctx == NULL || rawimg == NULL || si == NULL) { + if (svc_ctx == NULL || codec_ctx == NULL || si == NULL) { return VPX_CODEC_INVALID_PARAM; } @@ -866,9 +866,12 @@ vpx_codec_err_t vpx_svc_encode(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, si->is_keyframe = (si->frame_within_gop == 0); si->frame_size = 0; - svc_log(svc_ctx, SVC_LOG_DEBUG, - "vpx_svc_encode layers: %d, frame_count: %d, frame_within_gop: %d\n", - si->layers, si->encode_frame_count, si->frame_within_gop); + if (rawimg != NULL) { + svc_log(svc_ctx, SVC_LOG_DEBUG, + "vpx_svc_encode layers: %d, frame_count: %d, " + "frame_within_gop: %d\n", si->layers, si->encode_frame_count, + si->frame_within_gop); + } // encode each layer for (si->layer = 0; si->layer < si->layers; ++si->layer) { @@ -877,9 +880,11 @@ vpx_codec_err_t vpx_svc_encode(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, svc_log(svc_ctx, SVC_LOG_DEBUG, "Skip encoding layer %d\n", si->layer); continue; } - calculate_enc_frame_flags(svc_ctx); - set_svc_parameters(svc_ctx, codec_ctx); + if (rawimg != NULL) { + calculate_enc_frame_flags(svc_ctx); + set_svc_parameters(svc_ctx, codec_ctx); + } res = vpx_codec_encode(codec_ctx, rawimg, pts, (uint32_t)duration, si->enc_frame_flags, deadline); @@ -953,34 +958,39 @@ vpx_codec_err_t vpx_svc_encode(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, } } } + if (rawimg == NULL) { + break; + } } - // add superframe index to layer data list - sf_create_index(&superframe); - layer_data = ld_create(superframe.buffer, superframe.index_size); - ld_list_add(&cx_layer_list, layer_data); - - // get accumulated size of layer data - si->frame_size = ld_list_get_buffer_size(cx_layer_list); - if (si->frame_size == 0) return VPX_CODEC_ERROR; + if (codec_ctx->config.enc->g_pass != VPX_RC_FIRST_PASS) { + // add superframe index to layer data list + sf_create_index(&superframe); + layer_data = ld_create(superframe.buffer, superframe.index_size); + ld_list_add(&cx_layer_list, layer_data); + + // get accumulated size of layer data + si->frame_size = ld_list_get_buffer_size(cx_layer_list); + if (si->frame_size > 0) { + // all layers encoded, create single buffer with concatenated layers + if (si->frame_size > si->buffer_size) { + free(si->buffer); + si->buffer = malloc(si->frame_size); + if (si->buffer == NULL) { + ld_list_free(cx_layer_list); + return VPX_CODEC_MEM_ERROR; + } + si->buffer_size = si->frame_size; + } + // copy layer data into packet + ld_list_copy_to_buffer(cx_layer_list, (uint8_t *)si->buffer); - // all layers encoded, create single buffer with concatenated layers - if (si->frame_size > si->buffer_size) { - free(si->buffer); - si->buffer = malloc(si->frame_size); - if (si->buffer == NULL) { ld_list_free(cx_layer_list); - return VPX_CODEC_MEM_ERROR; + + svc_log(svc_ctx, SVC_LOG_DEBUG, "SVC frame: %d, kf: %d, size: %d, " + "pts: %d\n", si->encode_frame_count, si->is_keyframe, + (int)si->frame_size, (int)pts); } - si->buffer_size = si->frame_size; } - // copy layer data into packet - ld_list_copy_to_buffer(cx_layer_list, (uint8_t *)si->buffer); - - ld_list_free(cx_layer_list); - - svc_log(svc_ctx, SVC_LOG_DEBUG, "SVC frame: %d, kf: %d, size: %d, pts: %d\n", - si->encode_frame_count, si->is_keyframe, (int)si->frame_size, - (int)pts); ++si->frame_within_gop; ++si->encode_frame_count; |