SVT-AV1 svt_aom_motion_estimation_kernel 函數分析

void *svt_aom_motion_estimation_kernel(void *input_ptr) // 運動估計內核主函數,接收線程輸入參數

{

// 從輸入參數中獲取線程上下文指針

EbThreadContext * thread_ctx = (EbThreadContext *)input_ptr;

// 從線程上下文中獲取運動估計上下文指針

MotionEstimationContext_t *me_context_ptr = (MotionEstimationContext_t *)thread_ctx->priv;

// 輸入結果包裝器指針,用于接收來自上游的數據

EbObjectWrapper * in_results_wrapper_ptr;

// 輸出結果包裝器指針,用于向下游傳遞處理結果

EbObjectWrapper * out_results_wrapper;

for (;;) { // 無限循環,持續處理輸入的圖片數據

// 從輸入FIFO隊列中獲取完整的圖片決策結果對象

EB_GET_FULL_OBJECT(me_context_ptr->picture_decision_results_input_fifo_ptr,

&in_results_wrapper_ptr);

// 從包裝器中提取圖片決策結果指針

PictureDecisionResults *in_results_ptr = (PictureDecisionResults *)

in_results_wrapper_ptr->object_ptr;

// 從輸入結果中獲取圖片父控制集指針,包含當前圖片的所有控制信息

PictureParentControlSet *pcs = (PictureParentControlSet *)

in_results_ptr->pcs_wrapper->object_ptr;

// 獲取序列控制集指針,包含編碼序列的全局配置參數

SequenceControlSet *scs = pcs->scs;

// 根據輸入任務類型設置相應的運動估計類型

if (in_results_ptr->task_type == TASK_TFME)

// 如果是時域濾波運動估計任務,設置為MCTF模式

me_context_ptr->me_ctx->me_type = ME_MCTF;

else if (in_results_ptr->task_type == TASK_PAME || in_results_ptr->task_type == TASK_SUPERRES_RE_ME)

// 如果是預分析運動估計或超分辨率重新運動估計任務,設置為開環模式

me_context_ptr->me_ctx->me_type = ME_OPEN_LOOP;

else if (in_results_ptr->task_type == TASK_DG_DETECTOR_HME)

// 如果是動態GOP檢測分層運動估計任務,設置為檢測器模式

me_context_ptr->me_ctx->me_type = ME_DG_DETECTOR;

// 運動估計內核信號推導:根據任務類型設置具體的ME參數

if ((in_results_ptr->task_type == TASK_PAME) ||

(in_results_ptr->task_type == TASK_SUPERRES_RE_ME))

// 對于預分析或超分辨率重新ME任務,推導標準運動估計信號

svt_aom_sig_deriv_me(scs, pcs, me_context_ptr->me_ctx);

else if (in_results_ptr->task_type == TASK_TFME)

// 對于時域濾波任務,推導特定的時域濾波運動估計信號

svt_aom_sig_deriv_me_tf(pcs, me_context_ptr->me_ctx);

// 處理預分析運動估計和超分辨率重新運動估計任務

if ((in_results_ptr->task_type == TASK_PAME) ||

(in_results_ptr->task_type == TASK_SUPERRES_RE_ME)) {

// 1/16分辨率圖片緩沖區指針,用于粗粒度運動搜索

EbPictureBufferDesc *sixteenth_picture_ptr;

// 1/4分辨率圖片緩沖區指針,用于中等粒度運動搜索

EbPictureBufferDesc *quarter_picture_ptr;

// 填充后的輸入圖片緩沖區指針,用于邊界處理

EbPictureBufferDesc *input_padded_pic;

// 原始輸入圖片緩沖區指針

EbPictureBufferDesc *input_pic;

// 預分析引用對象指針,包含各種分辨率的圖片數據

EbPaReferenceObject *pa_ref_obj_;

// 斷言檢查引用圖片的生命周期計數 (調試版本使用)

//assert((int)pcs->pa_ref_pic_wrapper->live_count > 0);

// 從圖片控制集中獲取預分析引用對象

pa_ref_obj_ = (EbPaReferenceObject *)

pcs->pa_ref_pic_wrapper->object_ptr;

// 設置1/4和1/16分辨率的ME輸入緩沖區,已經過濾或抽取

// 獲取1/4分辨率下采樣圖片指針,用于分層運動估計的中層

quarter_picture_ptr = (EbPictureBufferDesc *)

pa_ref_obj_->quarter_downsampled_picture_ptr;

// 獲取1/16分辨率下采樣圖片指針,用于分層運動估計的最粗層

sixteenth_picture_ptr = (EbPictureBufferDesc *)

pa_ref_obj_->sixteenth_downsampled_picture_ptr;

// 獲取填充后的輸入圖片,確保邊界像素可用于運動搜索

input_padded_pic = (EbPictureBufferDesc *)pa_ref_obj_->input_padded_pic;

// 獲取增強后的輸入圖片,通常是經過預處理的原始圖片

input_pic = pcs->enhanced_pic;

// 圖片分段處理:將圖片劃分為多個段以支持并行處理

// 獲取當前處理的段索引

uint32_t segment_index = in_results_ptr->segment_index;

// 計算圖片寬度包含的64x64塊數量(向上取整)

uint32_t pic_width_in_b64 = (pcs->aligned_width + scs->b64_size - 1) / scs->b64_size;

// 計算圖片高度包含的64x64塊數量(向上取整)

uint32_t picture_height_in_b64 = (pcs->aligned_height + scs->b64_size - 1) / scs->b64_size;

// Y方向段索引

uint32_t y_segment_index;

// X方向段索引

uint32_t x_segment_index;

// 將一維段索引轉換為二維坐標(x,y)

SEGMENT_CONVERT_IDX_TO_XY(segment_index, x_segment_index, y_segment_index, pcs->me_segments_column_count);

// 計算當前段在X方向的起始64x64塊索引

uint32_t x_b64_start_index = SEGMENT_START_IDX(x_segment_index, pic_width_in_b64, pcs->me_segments_column_count);

// 計算當前段在X方向的結束64x64塊索引

uint32_t x_b64_end_index = SEGMENT_END_IDX(x_segment_index, pic_width_in_b64, pcs->me_segments_column_count);

// 計算當前段在Y方向的起始64x64塊索引

uint32_t y_b64_start_index = SEGMENT_START_IDX(y_segment_index, picture_height_in_b64, pcs->me_segments_row_count);

// 計算當前段在Y方向的結束64x64塊索引

uint32_t y_b64_end_index = SEGMENT_END_IDX(y_segment_index, picture_height_in_b64, pcs->me_segments_row_count);

// 初始化運動估計跳過標志

Bool skip_me = FALSE;

// 檢查當前圖片是否應該跳過運動估計(例如在多遍編碼中)

if (svt_aom_is_pic_skipped(pcs)) //判斷圖片是否被跳過

skip_me = TRUE;

// 為第一遍編碼跳過ME,因為ME已經執行過了

if (!skip_me) {

// 只對非I幀執行運動估計(I幀只有幀內預測)

if (pcs->slice_type != I_SLICE) {

// 如果引用圖片的分辨率與輸入不同,使用縮放的源引用

svt_aom_use_scaled_source_refs_if_needed(pcs,

input_pic,

pa_ref_obj_,

&input_padded_pic,

&quarter_picture_ptr,

&sixteenth_picture_ptr);

// 64x64塊級運動估計循環:遍歷當前段內的所有64x64塊

// Y方向遍歷當前段內的64x64塊

for (uint32_t y_b64_index = y_b64_start_index; y_b64_index < y_b64_end_index; ++y_b64_index) {

// X方向遍歷當前段內的64x64塊

for (uint32_t x_b64_index = x_b64_start_index; x_b64_index < x_b64_end_index; ++x_b64_index) {

// 計算當前64x64塊在整個圖片中的線性索引

uint32_t b64_index = (uint16_t)(x_b64_index + y_b64_index * pic_width_in_b64);

// 計算當前64x64塊在圖片中的X坐標起始位置(像素單位)

uint32_t b64_origin_x = x_b64_index * scs->b64_size;

// 計算當前64x64塊在圖片中的Y坐標起始位置(像素單位)

uint32_t b64_origin_y = y_b64_index * scs->b64_size;

// 從輸入圖片加載64x64塊到中間緩沖區

// 計算當前64x64塊在輸入圖片緩沖區中的起始位置索引

uint32_t buffer_index = (input_pic->org_y + b64_origin_y) * input_pic->stride_y +

input_pic->org_x + b64_origin_x;

#ifdef ARCH_X86_64

// 獲取當前64x64塊在填充圖片中的起始指針

uint8_t *src_ptr = &input_padded_pic->buffer_y[buffer_index];

// 計算實際的塊高度(處理圖片邊界情況)

uint32_t b64_height = (pcs->aligned_height - b64_origin_y) < BLOCK_SIZE_64

? pcs->aligned_height - b64_origin_y : BLOCK_SIZE_64;

// 數據預取優化:提前加載數據到CPU緩存以提高訪問速度

// 預取提示級別:_MM_HINT_T0(L1), _MM_HINT_T1(L2), _MM_HINT_T2(L3), _MM_HINT_NTA(非時間局部性)

for (uint32_t i = 0; i < b64_height; i++) {

// 計算每行數據的地址并預取到L3緩存

char const *p = (char const *)(src_ptr + i * input_padded_pic->stride_y);

_mm_prefetch(p, _MM_HINT_T2);

}

#endif

// 設置運動估計上下文中的64x64塊源數據指針

me_context_ptr->me_ctx->b64_src_ptr = &input_padded_pic->buffer_y[buffer_index];

// 設置源數據的行步長(stride)

me_context_ptr->me_ctx->b64_src_stride = input_padded_pic->stride_y;

// 加載1/4分辨率抽取的超級塊到1/4中間超級塊緩沖區

if (me_context_ptr->me_ctx->enable_hme_level1_flag) {

// 計算1/4分辨率圖片中對應位置的緩沖區索引(坐標右移1位即除以2)

buffer_index = (quarter_picture_ptr->org_y + (b64_origin_y >> 1)) * quarter_picture_ptr->stride_y +

quarter_picture_ptr->org_x + (b64_origin_x >> 1);

// 設置1/4分辨率64x64塊緩沖區指針

me_context_ptr->me_ctx->quarter_b64_buffer = &quarter_picture_ptr->buffer_y[buffer_index];

// 設置1/4分辨率緩沖區的行步長

me_context_ptr->me_ctx->quarter_b64_buffer_stride = quarter_picture_ptr->stride_y;

}

// 加載1/16分辨率抽取的超級塊到1/16中間超級塊緩沖區

if (me_context_ptr->me_ctx->enable_hme_level0_flag) {

// 計算1/16分辨率圖片中對應位置的緩沖區索引(坐標右移2位即除以4)

buffer_index = (sixteenth_picture_ptr->org_y + (b64_origin_y >> 2)) * sixteenth_picture_ptr->stride_y +

sixteenth_picture_ptr->org_x + (b64_origin_x >> 2);

// 設置1/16分辨率64x64塊緩沖區指針

me_context_ptr->me_ctx->sixteenth_b64_buffer = &sixteenth_picture_ptr->buffer_y[buffer_index];

// 設置1/16分辨率緩沖區的行步長

me_context_ptr->me_ctx->sixteenth_b64_buffer_stride = sixteenth_picture_ptr->stride_y;

}

// 設置運動估計類型為開環模式

me_context_ptr->me_ctx->me_type = ME_OPEN_LOOP;

// 配置運動估計搜索參數(僅適用于PAME和超分辨率重新ME任務)

if ((in_results_ptr->task_type == TASK_PAME) || (in_results_ptr->task_type == TASK_SUPERRES_RE_ME)) {

// 設置要搜索的引用列表數量:P幀只搜索List0,B幀搜索List0+List1

me_context_ptr->me_ctx->num_of_list_to_search =

(pcs->slice_type == P_SLICE) ? 1 /*只搜索List 0*/

: 2 /*搜索List 0 + 1*/;

// 設置List0中要搜索的引用圖片數量

me_context_ptr->me_ctx->num_of_ref_pic_to_search[0] = pcs->ref_list0_count_try;

// 對于B幀,設置List1中要搜索的引用圖片數量

if (pcs->slice_type == B_SLICE)

me_context_ptr->me_ctx->num_of_ref_pic_to_search[1] = pcs->ref_list1_count_try;

// 設置當前圖片的時域層索引

me_context_ptr->me_ctx->temporal_layer_index = pcs->temporal_layer_index;

// 設置當前圖片是否為引用圖片標志

me_context_ptr->me_ctx->is_ref = pcs->is_ref;

// 處理幀縮放(超分辨率或調整大小)情況下的引用圖片配置

if (pcs->frame_superres_enabled || pcs->frame_resize_enabled) {

// 遍歷所有引用列表(List0和List1)

for (int i = 0; i < me_context_ptr->me_ctx->num_of_list_to_search; i++) {

// 遍歷當前列表中的所有引用圖片

for (int j = 0; j < me_context_ptr->me_ctx->num_of_ref_pic_to_search[i]; j++) {

// 斷言檢查引用圖片的生命周期計數(調試版本)

//assert((int)pcs->ref_pa_pic_ptr_array[i][j]->live_count > 0);

// 獲取超分辨率分母索引

uint8_t sr_denom_idx = svt_aom_get_denom_idx(pcs->superres_denom);

// 獲取調整大小分母索引

uint8_t resize_denom_idx = svt_aom_get_denom_idx(pcs->resize_denom);

// 獲取引用對象指針

EbPaReferenceObject *ref_object =

(EbPaReferenceObject *)pcs->ref_pa_pic_ptr_array[i][j]->object_ptr;

// 設置縮放后的全分辨率引用圖片指針

me_context_ptr->me_ctx->me_ds_ref_array[i][j].picture_ptr =

ref_object->downscaled_input_padded_picture_ptr[sr_denom_idx][resize_denom_idx];

// 設置縮放后的1/4分辨率引用圖片指針

me_context_ptr->me_ctx->me_ds_ref_array[i][j].quarter_picture_ptr =

ref_object->downscaled_quarter_downsampled_picture_ptr[sr_denom_idx][resize_denom_idx];

// 設置縮放后的1/16分辨率引用圖片指針

me_context_ptr->me_ctx->me_ds_ref_array[i][j].sixteenth_picture_ptr =

ref_object->downscaled_sixteenth_downsampled_picture_ptr[sr_denom_idx][resize_denom_idx];

// 設置引用圖片的編號

me_context_ptr->me_ctx->me_ds_ref_array[i][j].picture_number =

ref_object->picture_number;

}

}

} else {

// 處理正常情況(無幀縮放)下的引用圖片配置

// 遍歷所有引用列表(List0和List1)

for (int i = 0; i < me_context_ptr->me_ctx->num_of_list_to_search; i++) {

// 遍歷當前列表中的所有引用圖片

for (int j = 0; j < me_context_ptr->me_ctx->num_of_ref_pic_to_search[i]; j++) {

// 斷言檢查引用圖片的生命周期計數(調試版本)

//assert((int)pcs->ref_pa_pic_ptr_array[i][j]->live_count > 0);

// 獲取引用對象指針

EbPaReferenceObject *ref_object =

(EbPaReferenceObject *)pcs->ref_pa_pic_ptr_array[i][j]->object_ptr;

// 設置原始全分辨率引用圖片指針

me_context_ptr->me_ctx->me_ds_ref_array[i][j].picture_ptr =

ref_object->input_padded_pic;

// 設置原始1/4分辨率引用圖片指針

me_context_ptr->me_ctx->me_ds_ref_array[i][j].quarter_picture_ptr =

ref_object->quarter_downsampled_picture_ptr;

// 設置原始1/16分辨率引用圖片指針

me_context_ptr->me_ctx->me_ds_ref_array[i][j].sixteenth_picture_ptr =

ref_object->sixteenth_downsampled_picture_ptr;

// 設置引用圖片的編號

me_context_ptr->me_ctx->me_ds_ref_array[i][j].picture_number =

ref_object->picture_number;

}

}

}

}

// 調用64x64塊級運動估計核心函數

// 傳入圖片控制集、塊索引、塊坐標、ME上下文和輸入圖片

svt_aom_motion_estimation_b64(pcs,

b64_index,

b64_origin_x,

b64_origin_y,

me_context_ptr->me_ctx,

input_pic);

// 處理全局運動估計(僅適用于PAME和超分辨率重新ME任務)

if ((in_results_ptr->task_type == TASK_PAME) || (in_results_ptr->task_type == TASK_SUPERRES_RE_ME)) {

// 獲取互斥鎖,保護共享的已處理塊計數器

svt_block_on_mutex(pcs->me_processed_b64_mutex);

// 增加已處理的64x64塊計數

pcs->me_processed_b64_count++;

// 檢查是否所有超級塊的ME都已完成,以便執行全局運動估計

if (pcs->me_processed_b64_count == pcs->b64_total_count) {

// 如果啟用了全局運動且滿足條件,執行全局運動估計

if (pcs->gm_ctrls.enabled && (!pcs->gm_ctrls.pp_enabled || pcs->gm_pp_detected)) {

svt_aom_global_motion_estimation(pcs, input_pic);

} else {

// 當全局運動關閉時,初始化全局運動狀態為OFF

memset(pcs->is_global_motion, FALSE, MAX_NUM_OF_REF_PIC_LIST * REF_LIST_MAX_DEPTH);

}

}

// 釋放互斥鎖

svt_release_mutex(pcs->me_processed_b64_mutex);

}

}

}

}

// 如果未啟用環內最優幀內搜索且啟用了時域預測布局,執行開環幀內搜索

if (scs->in_loop_ois == 0 && pcs->tpl_ctrls.enable)

// Y方向遍歷當前段內的64x64塊

for (uint32_t y_b64_index = y_b64_start_index; y_b64_index < y_b64_end_index; ++y_b64_index)

// X方向遍歷當前段內的64x64塊

for (uint32_t x_b64_index = x_b64_start_index; x_b64_index < x_b64_end_index; ++x_b64_index) {

// 計算當前64x64塊的線性索引

uint32_t b64_index = (uint16_t)(x_b64_index + y_b64_index * pic_width_in_b64);

// 對當前塊執行開環幀內搜索,為TPL(時域預測布局)提供信息

svt_aom_open_loop_intra_search_mb(pcs, b64_index, input_pic);

}

}

// 從輸出FIFO隊列獲取空的結果對象

svt_get_empty_object(me_context_ptr->motion_estimation_results_output_fifo_ptr,

&out_results_wrapper);

// 從結果包裝器中提取運動估計結果指針

MotionEstimationResults *out_results = (MotionEstimationResults *)

out_results_wrapper->object_ptr;

// 將輸入的圖片控制集包裝器傳遞給輸出結果

out_results->pcs_wrapper = in_results_ptr->pcs_wrapper;

// 傳遞段索引

out_results->segment_index = segment_index;

// 傳遞任務類型

out_results->task_type = in_results_ptr->task_type;

// 釋放輸入結果對象,表示已處理完成

svt_release_object(in_results_wrapper_ptr);

// 將完整的結果對象發送到輸出隊列,供下游模塊使用

svt_post_full_object(out_results_wrapper);

} else if (in_results_ptr->task_type == TASK_TFME) {

// 處理時域濾波運動估計任務

// 全局運動預處理(僅針對基礎B幀)

if (pcs->gm_ctrls.pp_enabled && pcs->gm_pp_enabled && in_results_ptr->segment_index==0)

// 執行全局運動預處理器,為時域濾波準備參數

svt_aom_gm_pre_processor(

pcs,

pcs->temp_filt_pcs_list);

// 開始時域濾波處理

// 設置運動估計類型為運動補償時域濾波(MCTF)

me_context_ptr->me_ctx->me_type = ME_MCTF;

// 初始化時域濾波,處理指定段的數據

svt_av1_init_temporal_filtering(

pcs->temp_filt_pcs_list, pcs, me_context_ptr, in_results_ptr->segment_index);

// 釋放輸入結果對象

svt_release_object(in_results_wrapper_ptr);

} else if (in_results_ptr->task_type == TASK_DG_DETECTOR_HME) {

// 處理動態GOP檢測分層運動估計任務

// 執行0級分層運動估計檢測器,用于動態GOP結構優化

dg_detector_hme_level0(pcs, in_results_ptr->segment_index);

// 釋放輸入結果對象

svt_release_object(in_results_wrapper_ptr);

}

} // 主循環結束

// 函數返回NULL,表示線程正常退出

return NULL;

}

// clang-format on

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95691.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95691.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95691.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于NET Core jwt Bearer Token 驗證的大坑,浪費3個小時,給各位兄弟搭個橋。

net core 使用jwt Bearer Token 認證獲取接口訪問權限&#xff0c;前期一陣操作沒任何問題&#xff0c;等認證接口寫的好了&#xff0c;通過PostMan測試的時候&#xff0c;總是報一個 IDX14102: Unable to decode the header eyJhbGciOiJIUzI1NiIsInR5cCI6 &#xff0c;錯誤&a…

系統架構設計師備考第14天——業務處理系統(TPS)

一、TPS的核心概念與定位 1. 定義與演進 定義&#xff1a;TPS&#xff08;Transaction Processing System&#xff09;又稱電子數據處理系統&#xff08;EDPS&#xff09;&#xff0c;是處理企業日常事務的信息系統&#xff0c;如財務、庫存、銷售等局部業務管理。歷史地位&…

目標檢測系列-Yolov5下載及運行

由于項目需要&#xff0c;最近一直在看目標檢測相關的資料&#xff0c;不過紙上得來終覺淺&#xff0c;絕知此事要躬行啊。從今日起&#xff0c;將學習的過程記錄一下&#xff0c;作為以后用來復習的材料吧。 我想最快的學習便是直接動手做項目&#xff0c;因此今天就將yolov5模…

Linux內核進程管理子系統有什么第四十二回 —— 進程主結構詳解(38)

接前一篇文章&#xff1a;Linux內核進程管理子系統有什么第四十一回 —— 進程主結構詳解&#xff08;37&#xff09; 本文內容參考&#xff1a; Linux內核進程管理專題報告_linux rseq-CSDN博客 《趣談Linux操作系統 核心原理篇&#xff1a;第三部分 進程管理》—— 劉超 《…

基于飛算JavaAI的學生成績綜合統計分析系統

第一章&#xff1a;項目概述與背景 1.1 項目背景與意義 在教育信息化飛速發展的今天&#xff0c;學生成績管理已成為學校教學管理的核心環節。傳統的學生成績管理多依賴于手工操作或基礎的信息管理系統&#xff0c;存在數據處理效率低、統計分析功能薄弱、數據可視化缺失等問題…

C++程序員必懂:std::bad_function_call異常的真相與預防秘訣

std::bad_function_call 是 C++ 標準庫在 <functional> 頭文件中定義的一個異常類型。當程序試圖調用一個未持有任何可調用目標(即處于“空狀態”)的 std::function 對象時,此異常會被拋出。本文將深入探討該異常的根本原因、詳細的觸發場景,并提供一套完整的預防與處…

Html重繪和重排

在網頁渲染過程中&#xff0c;重繪&#xff08;repaint&#xff09;和重排&#xff08;reflow&#xff09;是兩個重要的概念。理解它們的區別和優化方法對于提升網頁性能至關重要。重排&#xff08;Reflow&#xff09;重排是指當頁面元素的位置、尺寸等幾何屬性發生變化時&…

Redis 客戶端與服務器:銀行的 “客戶服務系統” 全流程

目錄 一、Redis 客戶端&#xff1a;銀行的 “客戶檔案” 二、客戶端關閉&#xff1a;銀行的 “終止服務規則” 三、命令處理流程&#xff1a;柜員辦理業務的 “標準步驟” 1. 接收申請單&#xff08;讀取命令請求&#xff09; 2. 確認業務類型&#xff08;查找命令&#x…

HTML圖片標簽及路徑詳解

圖片是網頁內容的重要組成部分&#xff0c;能夠使頁面更加生動直觀。在HTML中&#xff0c;使用<img>標簽插入圖片&#xff0c;而正確設置圖片路徑則是確保圖片能夠正常顯示的關鍵。一、圖片標簽&#xff08;<img>&#xff09;1. 圖片標簽的基本語法<img>標簽…

【數據庫通過日志恢復數據解讀】

在數據庫恢復機制中&#xff0c;日志文件是實現事務原子性、持久性和崩潰恢復的核心組件。以下通過具體示例和解讀方法&#xff0c;結合主流數據庫系統的實現細節&#xff0c;詳細說明日志文件的內容與分析邏輯。 一、日志文件的核心作用與結構 日志文件通過**預寫式日志&#…

【面試題】搜索準確性不高你怎么排查?

系統性排查框架&#xff1a;數據層檢查 索引覆蓋率&#xff1a;檢查文檔是否全部正確索引數據新鮮度&#xff1a;確認索引更新頻率和延遲文檔質量&#xff1a;分析被索引內容的質量和完整性查詢理解層 分詞分析&#xff1a;檢查查詢分詞是否正確意圖識別&#xff1a;驗證意圖分…

當AI開始“偷吃”用戶數據并拼裝功能模塊:初級開發者的腦洞保衛戰與老碼農的靈魂蘸料

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄當AI開…

Flowable——流程定義與部署(RepositoryService)

文章目錄 前言 參考資料 流程圖的部署、查詢與刪除 流程圖的準備 流程的部署 指定已部署流程信息查詢 刪除指定已部署流程 結語 前言 前篇博客具體說了怎么使用flowable去自動建表,以及搭建配置前端UI繪圖的界面。本篇博客主要說明對于已繪制好的流程圖如何去進行部署。 Flow…

采用基于模型的方法實現車輛SOA威脅分析自動化

摘要盡管采用面向服務架構&#xff08;SOA&#xff09;有助于實現自動駕駛、空中下載更新等功能&#xff0c;但同時也增加了車輛遭受攻擊的風險&#xff0c;可能對道路使用者造成傷害。為解決這一問題&#xff0c;相關標準&#xff08;ISO 21434 / 聯合國歐洲經濟委員會&#x…

C++語言編程規范-常量

01 C還有搞頭嗎 02 常量 不變的值更易于理解、跟蹤和分析&#xff0c;所以應該盡可能地使用常量代替變量&#xff0c;定義值的時候&#xff0c;應該把 const 作為默認的選項。使用 const 常量取代宏說明&#xff1a;宏是簡單的文本替換&#xff0c;在預處理階段時完成&#x…

【CS32L015C8T6】配置單片機PWM輸出(內附完整代碼及注釋)

目錄 前言&#xff1a; 一、CS32L015中定時器及PWM硬件資源介紹&#xff1a; 二、以CS32L015為例配置PWM步驟&#xff1a; 三、完整代碼及注釋 四、如果這篇文章能幫助到你&#xff0c;請點個贊鼓勵一下吧ξ( ?&#xff1e;??)~ 前言&#xff1a; CS32L015 是一款內嵌 …

hive表不顯示列注釋column comment的問題解決

安裝datasophon平臺hive后&#xff0c;發現hive表的字段注釋丟失了&#xff0c;表的注釋沒問題&#xff0c;csv格式的表沒問題&#xff0c;只有parquet和orc的表有這個問題。查網上似乎沒有這方面的問題。查看mysql表里面的中文注釋也一切正常&#xff0c;后來經過多次研究才發…

【筆記】AI Agent發展趨勢

前言 本章主要探討了現在AI技術的發展趨勢、大模型的一些局限性和小模型存在的必要性,然后引出了AI Agent的優勢與發展趨勢。 目標 學完本課程后,您將能夠: 了解大模型的局限性; 了解小模型存在的必要性; 了解AI Agent的優勢; 了解模型協同的技術。 目錄 1.AI發…

ChatDOC工具測評:AI驅動PDF/Word文檔處理,支持敏感內容隱私保護與表格提取分析

之前跟你們聊過用 Python 處理數據的 Pandas&#xff0c;今天換個更貼近日常辦公的方向 —— 給你們安利一個 AI 文檔處理工具「ChatDOC」&#xff0c;官網地址是https://www.chatdoc.com/&#xff0c;它能直接讀取 PDF、Word 里的內容&#xff0c;你不用逐頁翻文檔找信息&…

Vue + fetchEventSource 使用 AbortController 遇到的“只能中止一次”問題解析與解決方案

前言 在前端項目中&#xff0c;使用 SSE&#xff08;Server-Sent Events&#xff09; 長連接去獲取實時消息已經很常見了。像 fetchEventSource 這種封裝好的工具&#xff0c;可以幫助我們輕松處理流式請求。 不過在實踐中&#xff0c;我遇到了一個奇怪的問題&#xff1a;點擊按…