Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(574)

Side by Side Diff: source/libvpx/vp9/vp9_dx_iface.c

Issue 290653003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 28 matching lines...) Expand all
39 #if CONFIG_POSTPROC_VISUALIZER 39 #if CONFIG_POSTPROC_VISUALIZER
40 unsigned int dbg_postproc_flag; 40 unsigned int dbg_postproc_flag;
41 int dbg_color_ref_frame_flag; 41 int dbg_color_ref_frame_flag;
42 int dbg_color_mb_modes_flag; 42 int dbg_color_mb_modes_flag;
43 int dbg_color_b_modes_flag; 43 int dbg_color_b_modes_flag;
44 int dbg_display_mv_flag; 44 int dbg_display_mv_flag;
45 #endif 45 #endif
46 vpx_decrypt_cb decrypt_cb; 46 vpx_decrypt_cb decrypt_cb;
47 void *decrypt_state; 47 void *decrypt_state;
48 vpx_image_t img; 48 vpx_image_t img;
49 int img_setup;
50 int img_avail; 49 int img_avail;
51 int invert_tile_order; 50 int invert_tile_order;
52 51
53 // External frame buffer info to save for VP9 common. 52 // External frame buffer info to save for VP9 common.
54 void *ext_priv; // Private data associated with the external frame buffers. 53 void *ext_priv; // Private data associated with the external frame buffers.
55 vpx_get_frame_buffer_cb_fn_t get_ext_fb_cb; 54 vpx_get_frame_buffer_cb_fn_t get_ext_fb_cb;
56 vpx_release_frame_buffer_cb_fn_t release_ext_fb_cb; 55 vpx_release_frame_buffer_cb_fn_t release_ext_fb_cb;
57 }; 56 };
58 57
59 static vpx_codec_err_t decoder_init(vpx_codec_ctx_t *ctx, 58 static vpx_codec_err_t decoder_init(vpx_codec_ctx_t *ctx,
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 flags->noise_level = ctx->postproc_cfg.noise_level; 237 flags->noise_level = ctx->postproc_cfg.noise_level;
239 #if CONFIG_POSTPROC_VISUALIZER 238 #if CONFIG_POSTPROC_VISUALIZER
240 flags->display_ref_frame_flag = ctx->dbg_color_ref_frame_flag; 239 flags->display_ref_frame_flag = ctx->dbg_color_ref_frame_flag;
241 flags->display_mb_modes_flag = ctx->dbg_color_mb_modes_flag; 240 flags->display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
242 flags->display_b_modes_flag = ctx->dbg_color_b_modes_flag; 241 flags->display_b_modes_flag = ctx->dbg_color_b_modes_flag;
243 flags->display_mv_flag = ctx->dbg_display_mv_flag; 242 flags->display_mv_flag = ctx->dbg_display_mv_flag;
244 #endif 243 #endif
245 } 244 }
246 245
247 static void init_decoder(vpx_codec_alg_priv_t *ctx) { 246 static void init_decoder(vpx_codec_alg_priv_t *ctx) {
248 VP9DecoderConfig oxcf; 247 ctx->pbi = vp9_decoder_create();
249 oxcf.width = ctx->si.w;
250 oxcf.height = ctx->si.h;
251 oxcf.version = 9;
252 oxcf.max_threads = ctx->cfg.threads;
253 oxcf.inv_tile_order = ctx->invert_tile_order;
254
255 ctx->pbi = vp9_decoder_create(&oxcf);
256 if (ctx->pbi == NULL) 248 if (ctx->pbi == NULL)
257 return; 249 return;
258 250
251 ctx->pbi->max_threads = ctx->cfg.threads;
252 ctx->pbi->inv_tile_order = ctx->invert_tile_order;
253
259 vp9_initialize_dec(); 254 vp9_initialize_dec();
260 255
261 // If postprocessing was enabled by the application and a 256 // If postprocessing was enabled by the application and a
262 // configuration has not been provided, default it. 257 // configuration has not been provided, default it.
263 if (!ctx->postproc_cfg_set && 258 if (!ctx->postproc_cfg_set &&
264 (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) 259 (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC))
265 set_default_ppflags(&ctx->postproc_cfg); 260 set_default_ppflags(&ctx->postproc_cfg);
266 261
267 init_buffer_callbacks(ctx); 262 init_buffer_callbacks(ctx);
268 } 263 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 for (j = 0; j < mag; j++) 363 for (j = 0; j < mag; j++)
369 this_sz |= (*x++) << (j * 8); 364 this_sz |= (*x++) << (j * 8);
370 sizes[i] = this_sz; 365 sizes[i] = this_sz;
371 } 366 }
372 367
373 *count = frames; 368 *count = frames;
374 } 369 }
375 } 370 }
376 } 371 }
377 372
373 static vpx_codec_err_t decode_one_iter(vpx_codec_alg_priv_t *ctx,
374 const uint8_t **data_start_ptr,
375 const uint8_t *data_end,
376 uint32_t frame_size, void *user_priv,
377 long deadline) {
378 const vpx_codec_err_t res = decode_one(ctx, data_start_ptr, frame_size,
379 user_priv, deadline);
380 if (res != VPX_CODEC_OK)
381 return res;
382
383 // Account for suboptimal termination by the encoder.
384 while (*data_start_ptr < data_end) {
385 const uint8_t marker = read_marker(ctx->decrypt_cb, ctx->decrypt_state,
386 *data_start_ptr);
387 if (marker)
388 break;
389 (*data_start_ptr)++;
390 }
391
392 return VPX_CODEC_OK;
393 }
394
378 static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx, 395 static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx,
379 const uint8_t *data, unsigned int data_sz, 396 const uint8_t *data, unsigned int data_sz,
380 void *user_priv, long deadline) { 397 void *user_priv, long deadline) {
381 const uint8_t *data_start = data; 398 const uint8_t *data_start = data;
382 const uint8_t *data_end = data + data_sz; 399 const uint8_t *const data_end = data + data_sz;
383 vpx_codec_err_t res = VPX_CODEC_OK; 400 vpx_codec_err_t res;
384 uint32_t sizes[8]; 401 uint32_t frame_sizes[8];
385 int frames_this_pts, frame_count = 0; 402 int frame_count;
386 403
387 if (data == NULL || data_sz == 0) 404 if (data == NULL || data_sz == 0)
388 return VPX_CODEC_INVALID_PARAM; 405 return VPX_CODEC_INVALID_PARAM;
389 406
390 parse_superframe_index(data, data_sz, sizes, &frames_this_pts, 407 parse_superframe_index(data, data_sz, frame_sizes, &frame_count,
391 ctx->decrypt_cb, ctx->decrypt_state); 408 ctx->decrypt_cb, ctx->decrypt_state);
392 409
393 do { 410 if (frame_count > 0) {
394 if (data_sz) { 411 int i;
395 uint8_t marker = read_marker(ctx->decrypt_cb, ctx->decrypt_state,
396 data_start);
397 // Skip over the superframe index, if present
398 if ((marker & 0xe0) == 0xc0) {
399 const uint32_t frames = (marker & 0x7) + 1;
400 const uint32_t mag = ((marker >> 3) & 0x3) + 1;
401 const uint32_t index_sz = 2 + mag * frames;
402 412
403 if (data_sz >= index_sz) { 413 for (i = 0; i < frame_count; ++i) {
404 uint8_t marker2 = read_marker(ctx->decrypt_cb, ctx->decrypt_state, 414 const uint32_t frame_size = frame_sizes[i];
405 data_start + index_sz - 1); 415 if (data_start < data ||
406 if (marker2 == marker) { 416 frame_size > (uint32_t)(data_end - data_start)) {
407 data_start += index_sz;
408 data_sz -= index_sz;
409 if (data_start < data_end)
410 continue;
411 else
412 break;
413 }
414 }
415 }
416 }
417
418 // Use the correct size for this frame, if an index is present.
419 if (frames_this_pts) {
420 uint32_t this_sz = sizes[frame_count];
421
422 if (data_sz < this_sz) {
423 ctx->base.err_detail = "Invalid frame size in index"; 417 ctx->base.err_detail = "Invalid frame size in index";
424 return VPX_CODEC_CORRUPT_FRAME; 418 return VPX_CODEC_CORRUPT_FRAME;
425 } 419 }
426 420
427 data_sz = this_sz; 421 res = decode_one_iter(ctx, &data_start, data_end, frame_size,
428 frame_count++; 422 user_priv, deadline);
423 if (res != VPX_CODEC_OK)
424 return res;
429 } 425 }
426 } else {
427 while (data_start < data_end) {
428 res = decode_one_iter(ctx, &data_start, data_end,
429 (uint32_t)(data_end - data_start),
430 user_priv, deadline);
431 if (res != VPX_CODEC_OK)
432 return res;
433 }
434 }
430 435
431 res = decode_one(ctx, &data_start, data_sz, user_priv, deadline); 436 return VPX_CODEC_OK;
432 assert(data_start >= data);
433 assert(data_start <= data_end);
434
435 // Early exit if there was a decode error
436 if (res)
437 break;
438
439 // Account for suboptimal termination by the encoder.
440 while (data_start < data_end) {
441 uint8_t marker3 = read_marker(ctx->decrypt_cb, ctx->decrypt_state,
442 data_start);
443 if (marker3)
444 break;
445 data_start++;
446 }
447
448 data_sz = (unsigned int)(data_end - data_start);
449 } while (data_start < data_end);
450
451 return res;
452 } 437 }
453 438
454 static vpx_image_t *decoder_get_frame(vpx_codec_alg_priv_t *ctx, 439 static vpx_image_t *decoder_get_frame(vpx_codec_alg_priv_t *ctx,
455 vpx_codec_iter_t *iter) { 440 vpx_codec_iter_t *iter) {
456 vpx_image_t *img = NULL; 441 vpx_image_t *img = NULL;
457 442
458 if (ctx->img_avail) { 443 if (ctx->img_avail) {
459 // iter acts as a flip flop, so an image is only returned on the first 444 // iter acts as a flip flop, so an image is only returned on the first
460 // call to get_frame. 445 // call to get_frame.
461 if (!(*iter)) { 446 if (!(*iter)) {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 }, 664 },
680 { // NOLINT 665 { // NOLINT
681 NOT_IMPLEMENTED, 666 NOT_IMPLEMENTED,
682 NOT_IMPLEMENTED, 667 NOT_IMPLEMENTED,
683 NOT_IMPLEMENTED, 668 NOT_IMPLEMENTED,
684 NOT_IMPLEMENTED, 669 NOT_IMPLEMENTED,
685 NOT_IMPLEMENTED, 670 NOT_IMPLEMENTED,
686 NOT_IMPLEMENTED 671 NOT_IMPLEMENTED
687 } 672 }
688 }; 673 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698