int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsigned char *source, INT64 time_stamp) { VP8D_COMP *pbi = (VP8D_COMP *) ptr; VP8_COMMON *cm = &pbi->common; int retcode = 0; struct vpx_usec_timer timer; // if(pbi->ready_for_new_data == 0) // return -1; if (ptr == 0) { return -1; } pbi->common.error.error_code = VPX_CODEC_OK; if (setjmp(pbi->common.error.jmp)) { pbi->common.error.setjmp = 0; return -1; } pbi->common.error.setjmp = 1; #if HAVE_ARMV7 vp8_push_neon(dx_store_reg); #endif vpx_usec_timer_start(&timer); //cm->current_video_frame++; pbi->Source = source; pbi->source_sz = size; retcode = vp8_decode_frame(pbi); if (retcode < 0) { #if HAVE_ARMV7 vp8_pop_neon(dx_store_reg); #endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; return retcode; } // Update the GF useage maps. vp8_update_gf_useage_maps(cm, &pbi->mb); if (pbi->b_multithreaded_lf && pbi->common.filter_level != 0) vp8_stop_lfthread(pbi); if (cm->refresh_last_frame) { vp8_swap_yv12_buffer(&cm->last_frame, &cm->new_frame); cm->frame_to_show = &cm->last_frame; } else { cm->frame_to_show = &cm->new_frame; } if (!pbi->b_multithreaded_lf) { struct vpx_usec_timer lpftimer; vpx_usec_timer_start(&lpftimer); // Apply the loop filter if appropriate. if (cm->filter_level > 0) { vp8_loop_filter_frame(cm, &pbi->mb, cm->filter_level); cm->last_frame_type = cm->frame_type; cm->last_filter_type = cm->filter_type; cm->last_sharpness_level = cm->sharpness_level; } vpx_usec_timer_mark(&lpftimer); pbi->time_loop_filtering += vpx_usec_timer_elapsed(&lpftimer); } vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show); #if 0 // DEBUG code //vp8_recon_write_yuv_frame("recon.yuv", cm->frame_to_show); if (cm->current_video_frame <= 5) write_dx_frame_to_file(cm->frame_to_show, cm->current_video_frame); #endif // If any buffer copy / swaping is signalled it should be done here. if (cm->copy_buffer_to_arf) { if (cm->copy_buffer_to_arf == 1) { if (cm->refresh_last_frame) vp8_yv12_copy_frame_ptr(&cm->new_frame, &cm->alt_ref_frame); else vp8_yv12_copy_frame_ptr(&cm->last_frame, &cm->alt_ref_frame); } else if (cm->copy_buffer_to_arf == 2) vp8_yv12_copy_frame_ptr(&cm->golden_frame, &cm->alt_ref_frame); } if (cm->copy_buffer_to_gf) { if (cm->copy_buffer_to_gf == 1) { if (cm->refresh_last_frame) vp8_yv12_copy_frame_ptr(&cm->new_frame, &cm->golden_frame); else vp8_yv12_copy_frame_ptr(&cm->last_frame, &cm->golden_frame); } else if (cm->copy_buffer_to_gf == 2) vp8_yv12_copy_frame_ptr(&cm->alt_ref_frame, &cm->golden_frame); } // Should the golden or alternate reference frame be refreshed? if (cm->refresh_golden_frame || cm->refresh_alt_ref_frame) { if (cm->refresh_golden_frame) vp8_yv12_copy_frame_ptr(cm->frame_to_show, &cm->golden_frame); if (cm->refresh_alt_ref_frame) vp8_yv12_copy_frame_ptr(cm->frame_to_show, &cm->alt_ref_frame); //vpx_log("Decoder: recovery frame received \n"); // Update data structures that monitors GF useage vpx_memset(cm->gf_active_flags, 1, (cm->mb_rows * cm->mb_cols)); cm->gf_active_count = cm->mb_rows * cm->mb_cols; } vp8_clear_system_state(); vpx_usec_timer_mark(&timer); pbi->decode_microseconds = vpx_usec_timer_elapsed(&timer); pbi->time_decoding += pbi->decode_microseconds; // vp8_print_modes_and_motion_vectors( cm->mi, cm->mb_rows,cm->mb_cols, cm->current_video_frame); if (cm->show_frame) cm->current_video_frame++; pbi->ready_for_new_data = 0; pbi->last_time_stamp = time_stamp; #if 0 { int i; INT64 earliest_time = pbi->dr[0].time_stamp; INT64 latest_time = pbi->dr[0].time_stamp; INT64 time_diff = 0; int bytes = 0; pbi->dr[pbi->common.current_video_frame&0xf].size = pbi->bc.pos + pbi->bc2.pos + 4;; pbi->dr[pbi->common.current_video_frame&0xf].time_stamp = time_stamp; for (i = 0; i < 16; i++) { bytes += pbi->dr[i].size; if (pbi->dr[i].time_stamp < earliest_time) earliest_time = pbi->dr[i].time_stamp; if (pbi->dr[i].time_stamp > latest_time) latest_time = pbi->dr[i].time_stamp; } time_diff = latest_time - earliest_time; if (time_diff > 0) { pbi->common.bitrate = 80000.00 * bytes / time_diff ; pbi->common.framerate = 160000000.00 / time_diff ; } } #endif #if HAVE_ARMV7 vp8_pop_neon(dx_store_reg); #endif pbi->common.error.setjmp = 0; return retcode; }
int vp8dx_receive_compressed_data(VP8D_COMP *pbi, size_t size, const uint8_t *source, int64_t time_stamp, uint8_t dry_run) { #if HAVE_NEON int64_t dx_store_reg[8]; #endif VP8_COMMON *cm = &pbi->common; int retcode = -1; pbi->common.error.error_code = VPX_CODEC_OK; retcode = check_fragments_for_errors(pbi); if(retcode <= 0) return retcode; #if HAVE_NEON #if CONFIG_RUNTIME_CPU_DETECT if (cm->cpu_caps & HAS_NEON) #endif { vp8_push_neon(dx_store_reg); } #endif cm->new_fb_idx = get_free_fb (cm); /* setup reference frames for vp8_decode_frame */ pbi->dec_fb_ref[INTRA_FRAME] = &cm->yv12_fb[cm->new_fb_idx]; pbi->dec_fb_ref[LAST_FRAME] = &cm->yv12_fb[cm->lst_fb_idx]; pbi->dec_fb_ref[GOLDEN_FRAME] = &cm->yv12_fb[cm->gld_fb_idx]; pbi->dec_fb_ref[ALTREF_FRAME] = &cm->yv12_fb[cm->alt_fb_idx]; if (setjmp(pbi->common.error.jmp)) { /* We do not know if the missing frame(s) was supposed to update * any of the reference buffers, but we act conservative and * mark only the last buffer as corrupted. */ cm->yv12_fb[cm->lst_fb_idx].corrupted = 1; if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) cm->fb_idx_ref_cnt[cm->new_fb_idx]--; goto decode_exit; } pbi->common.error.setjmp = 1; retcode = vp8_decode_frame(pbi, dry_run); if (retcode < 0) { if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) cm->fb_idx_ref_cnt[cm->new_fb_idx]--; pbi->common.error.error_code = VPX_CODEC_ERROR; goto decode_exit; } if (swap_frame_buffers (cm)) { pbi->common.error.error_code = VPX_CODEC_ERROR; goto decode_exit; } vp8_clear_system_state(); if (cm->show_frame) { cm->current_video_frame++; cm->show_frame_mi = cm->mi; } #if CONFIG_ERROR_CONCEALMENT /* swap the mode infos to storage for future error concealment */ if (pbi->ec_enabled && pbi->common.prev_mi) { MODE_INFO* tmp = pbi->common.prev_mi; int row, col; pbi->common.prev_mi = pbi->common.mi; pbi->common.mi = tmp; /* Propagate the segment_ids to the next frame */ for (row = 0; row < pbi->common.mb_rows; ++row) { for (col = 0; col < pbi->common.mb_cols; ++col) { const int i = row*pbi->common.mode_info_stride + col; pbi->common.mi[i].mbmi.segment_id = pbi->common.prev_mi[i].mbmi.segment_id; } } } #endif pbi->ready_for_new_data = 0; pbi->last_time_stamp = time_stamp; decode_exit: #if HAVE_NEON #if CONFIG_RUNTIME_CPU_DETECT if (cm->cpu_caps & HAS_NEON) #endif { vp8_pop_neon(dx_store_reg); } #endif pbi->common.error.setjmp = 0; return retcode; }
int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsigned char *source, INT64 time_stamp) { #if HAVE_ARMV7 INT64 dx_store_reg[8]; #endif VP8D_COMP *pbi = (VP8D_COMP *) ptr; VP8_COMMON *cm = &pbi->common; int retcode = 0; struct vpx_usec_timer timer; /*if(pbi->ready_for_new_data == 0) return -1;*/ if (ptr == 0) { return -1; } pbi->common.error.error_code = VPX_CODEC_OK; if (size == 0) { /* This is used to signal that we are missing frames. * We do not know if the missing frame(s) was supposed to update * any of the reference buffers, but we act conservative and * mark only the last buffer as corrupted. */ cm->yv12_fb[cm->lst_fb_idx].corrupted = 1; /* Signal that we have no frame to show. */ cm->show_frame = 0; /* Nothing more to do. */ return 0; } #if HAVE_ARMV7 #if CONFIG_RUNTIME_CPU_DETECT if (cm->rtcd.flags & HAS_NEON) #endif { vp8_push_neon(dx_store_reg); } #endif cm->new_fb_idx = get_free_fb (cm); if (setjmp(pbi->common.error.jmp)) { #if HAVE_ARMV7 #if CONFIG_RUNTIME_CPU_DETECT if (cm->rtcd.flags & HAS_NEON) #endif { vp8_pop_neon(dx_store_reg); } #endif pbi->common.error.setjmp = 0; /* We do not know if the missing frame(s) was supposed to update * any of the reference buffers, but we act conservative and * mark only the last buffer as corrupted. */ cm->yv12_fb[cm->lst_fb_idx].corrupted = 1; if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) cm->fb_idx_ref_cnt[cm->new_fb_idx]--; return -1; } pbi->common.error.setjmp = 1; vpx_usec_timer_start(&timer); /*cm->current_video_frame++;*/ pbi->Source = source; pbi->source_sz = size; retcode = vp8_decode_frame(pbi); if (retcode < 0) { #if HAVE_ARMV7 #if CONFIG_RUNTIME_CPU_DETECT if (cm->rtcd.flags & HAS_NEON) #endif { vp8_pop_neon(dx_store_reg); } #endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) cm->fb_idx_ref_cnt[cm->new_fb_idx]--; return retcode; } #if CONFIG_MULTITHREAD if (pbi->b_multithreaded_rd && cm->multi_token_partition != ONE_PARTITION) { if (swap_frame_buffers (cm)) { #if HAVE_ARMV7 #if CONFIG_RUNTIME_CPU_DETECT if (cm->rtcd.flags & HAS_NEON) #endif { vp8_pop_neon(dx_store_reg); } #endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; return -1; } } else #endif { if (swap_frame_buffers (cm)) { #if HAVE_ARMV7 #if CONFIG_RUNTIME_CPU_DETECT if (cm->rtcd.flags & HAS_NEON) #endif { vp8_pop_neon(dx_store_reg); } #endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; return -1; } if(pbi->common.filter_level) { struct vpx_usec_timer lpftimer; vpx_usec_timer_start(&lpftimer); /* Apply the loop filter if appropriate. */ vp8_loop_filter_frame(cm, &pbi->mb, cm->filter_level); vpx_usec_timer_mark(&lpftimer); pbi->time_loop_filtering += vpx_usec_timer_elapsed(&lpftimer); cm->last_frame_type = cm->frame_type; cm->last_filter_type = cm->filter_type; cm->last_sharpness_level = cm->sharpness_level; } vp8_yv12_extend_frame_borders_ptr(cm->frame_to_show); } vp8_clear_system_state(); vpx_usec_timer_mark(&timer); pbi->decode_microseconds = vpx_usec_timer_elapsed(&timer); pbi->time_decoding += pbi->decode_microseconds; /*vp8_print_modes_and_motion_vectors( cm->mi, cm->mb_rows,cm->mb_cols, cm->current_video_frame);*/ if (cm->show_frame) cm->current_video_frame++; pbi->ready_for_new_data = 0; pbi->last_time_stamp = time_stamp; #if 0 { int i; INT64 earliest_time = pbi->dr[0].time_stamp; INT64 latest_time = pbi->dr[0].time_stamp; INT64 time_diff = 0; int bytes = 0; pbi->dr[pbi->common.current_video_frame&0xf].size = pbi->bc.pos + pbi->bc2.pos + 4;; pbi->dr[pbi->common.current_video_frame&0xf].time_stamp = time_stamp; for (i = 0; i < 16; i++) { bytes += pbi->dr[i].size; if (pbi->dr[i].time_stamp < earliest_time) earliest_time = pbi->dr[i].time_stamp; if (pbi->dr[i].time_stamp > latest_time) latest_time = pbi->dr[i].time_stamp; } time_diff = latest_time - earliest_time; if (time_diff > 0) { pbi->common.bitrate = 80000.00 * bytes / time_diff ; pbi->common.framerate = 160000000.00 / time_diff ; } } #endif #if HAVE_ARMV7 #if CONFIG_RUNTIME_CPU_DETECT if (cm->rtcd.flags & HAS_NEON) #endif { vp8_pop_neon(dx_store_reg); } #endif pbi->common.error.setjmp = 0; return retcode; }