int HWCDisplayPrimary::FrameCaptureAsync(const BufferInfo &output_buffer_info, bool post_processed_output) { // Note: This function is called in context of a binder thread and a lock is already held if (output_buffer_info.alloc_buffer_info.fd < 0) { DLOGE("Invalid fd %d", output_buffer_info.alloc_buffer_info.fd); return -1; } auto panel_width = 0u; auto panel_height = 0u; auto fb_width = 0u; auto fb_height = 0u; GetPanelResolution(&panel_width, &panel_height); GetFrameBufferResolution(&fb_width, &fb_height); if (post_processed_output && (output_buffer_info_.buffer_config.width < panel_width || output_buffer_info_.buffer_config.height < panel_height)) { DLOGE("Buffer dimensions should not be less than panel resolution"); return -1; } else if (!post_processed_output && (output_buffer_info_.buffer_config.width < fb_width || output_buffer_info_.buffer_config.height < fb_height)) { DLOGE("Buffer dimensions should not be less than FB resolution"); return -1; } SetLayerBuffer(output_buffer_info, &output_buffer_); post_processed_output_ = post_processed_output; frame_capture_buffer_queued_ = true; // Status is only cleared on a new call to dump and remains valid otherwise frame_capture_status_ = -EAGAIN; DisablePartialUpdateOneFrame(); return 0; }
void HWCDisplayExternal::ApplyScanAdjustment(hwc_rect_t *display_frame) { if (display_intf_->IsUnderscanSupported()) { return; } // Read user defined width and height ratio int width = 0, height = 0; HWCDebugHandler::Get()->GetProperty("sdm.external_action_safe_width", &width); float width_ratio = FLOAT(width) / 100.0f; HWCDebugHandler::Get()->GetProperty("sdm.external_action_safe_height", &height); float height_ratio = FLOAT(height) / 100.0f; if (width_ratio == 0.0f || height_ratio == 0.0f) { return; } uint32_t panel_width = 0; uint32_t panel_height = 0; GetPanelResolution(&panel_width, &panel_height); if (panel_width == 0 || panel_height == 0) { DLOGV("Invalid panel dimensions (%d, %d)", panel_width, panel_height); return; } int x_offset = INT((FLOAT(panel_width) * width_ratio) / 2.0f); int y_offset = INT((FLOAT(panel_height) * height_ratio) / 2.0f); display_frame->left = display_frame->left + x_offset; display_frame->top = display_frame->top + y_offset; display_frame->right = display_frame->right - x_offset; display_frame->bottom = display_frame->bottom - y_offset; }
void HWCDisplayPrimary::SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type) { HWCDisplay::SetFrameDumpConfig(count, bit_mask_layer_type); dump_output_to_file_ = bit_mask_layer_type & (1 << OUTPUT_LAYER_DUMP); DLOGI("output_layer_dump_enable %d", dump_output_to_file_); if (!count || !dump_output_to_file_) { return; } // Allocate and map output buffer output_buffer_info_ = {}; // Since we dump DSPP output use Panel resolution. GetPanelResolution(&output_buffer_info_.buffer_config.width, &output_buffer_info_.buffer_config.height); output_buffer_info_.buffer_config.format = kFormatRGB888; output_buffer_info_.buffer_config.buffer_count = 1; if (buffer_allocator_->AllocateBuffer(&output_buffer_info_) != 0) { DLOGE("Buffer allocation failed"); output_buffer_info_ = {}; return; } void *buffer = mmap(NULL, output_buffer_info_.alloc_buffer_info.size, PROT_READ | PROT_WRITE, MAP_SHARED, output_buffer_info_.alloc_buffer_info.fd, 0); if (buffer == MAP_FAILED) { DLOGE("mmap failed with err %d", errno); buffer_allocator_->FreeBuffer(&output_buffer_info_); output_buffer_info_ = {}; return; } output_buffer_base_ = buffer; post_processed_output_ = true; DisablePartialUpdateOneFrame(); }