Merged
bugfix 分辨率切换时录制概率崩溃 #231
bugfix 分辨率切换时录制概率崩溃 #231
Merged
linsanjiuAdd on Jun 18
linsanjiu
linsanjiu
Jun 18

https://gitcode.com/CPF-ApplicationTPC/ohos_ijkplayer/issues/377

修复分辨率切换时录制视频操作概率崩溃

likedislike
Pull Request has been successfully merged by openharmony_ci.
(Thank you for linsanjiu's contribution.)
cpf-manager
cpf-managerJun 18Start code review2
ijkplayer/src/main/cpp/ijkplayer/record/ijkplayer_record.cpp
Outdated
@@ -585,3 +585,2 @@
585585 RecordVideoSwsState swsState;
586- swsState.outWidth = recordWriteData->srcFormat.width;
587- swsState.outHeight = recordWriteData->srcFormat.height;
586+ swsState.outWidth = recordWriteData->video_st.st->codec->width;
cpf-manager
cpf-managerJun 18Comments:

【AI-Review】【一般】【基础代码问题】【稳定性问题】多级指针解引用缺少空指针检查

● 问题:新增代码 recordWriteData->video_st.st->codec->width 涉及三级指针解引用(video_st.stst->codeccodec->width),但未进行任何空指针检查。虽然当前代码流程中 StartEncoderWrite()VideoAudioStreamAndAvcodecOpen() 成功之后才被调用,video_st.stst->codec 理应有效,但缺乏防御性检查使得代码在面对异常场景或未来修改时存在崩溃风险。旧代码使用 srcFormat.width/height(值类型,嵌入在 RecordWriteData 结构体中)则不存在此问题。

● 影响:若因编码器初始化异常或代码路径变更导致 video_st.stst->codec 为空,将导致空指针解引用崩溃。

● 建议:添加防御性空指针检查:

if (!recordWriteData->video_st.st || !recordWriteData->video_st.st->codec) {
    LOGE("ERROR: video stream or codec is NULL in StartEncoderWrite");
    return;
}
swsState.outWidth = recordWriteData->video_st.st->codec->width;
swsState.outHeight = recordWriteData->video_st.st->codec->height;
likedislike
linsanjiu
linsanjiu
Jun 18 Comments:

不采纳。StartEncoderWrite 仅在 VideoAudioStreamAndAvcodecOpen 成功后才调用,此前 AddStream/OpenVideo 已保证 video_st.st 和 st->codec 有效,失败会直接 goto fail,不会进入该函数。上游已有防护,此处无需重复判空。

cpf-manager
cpf-managerJun 18Start code review2
ijkplayer/src/main/cpp/ijkplayer/record/ijkplayer_record.cpp
@@ -583,8 +583,8 @@ void StartEncoderWrite(AVFormatContext *oc, RecordWriteData *recordWriteData, FF
583583 OutputStream *audioStPtr, int frameRate)
584584{
585585 RecordVideoSwsState swsState;
586- swsState.outWidth = recordWriteData->srcFormat.width;
587- swsState.outHeight = recordWriteData->srcFormat.height;
586+ swsState.outWidth = recordWriteData->video_st.st->codec->width;
587+ swsState.outHeight = recordWriteData->video_st.st->codec->height;
588588 while (true) {
589589 recordWriteData = &mFFPlayer->record_write_data;
590590 int totalFrameIndex = recordWriteData->windex;
@@ -665,7 +665,7 @@
665665 IS_PRIORITY = mFFPlayer->record_write_data.isPriority;
666666}
667667 
668668static void InitRecordOutputResolution(RecordWriteData *recordWriteData)
cpf-manager
cpf-managerJun 18Comments:

【AI-Review】【一般】【基础代码问题】【稳定性问题】srcFormat 不再从帧数据更新后的时序一致性

● 问题:此 PR 移除了 ff_ffplay.c:record_video_frame()ffpipenode_ohos_mediacodec_vdec.cpp:RecordMediaCodecVideoFrame() 中对 srcFormat.width/height 的逐帧更新。这消除了解码线程与录制线程之间的数据竞争(旧代码中解码线程写 srcFormat,录制线程读 srcFormat,无同步机制),是正确的修复。但 srcFormat 仍在 InitRecordOutputResolution() 中从帧队列首帧设置,并用于 AddStream() 配置编码器尺寸。修改后 srcFormat 的语义从"当前帧格式"变为"初始帧格式",且不再反映分辨率动态变化。虽然当前录制流程中编码器尺寸固定不变、UpdateRecordVideoSwsContext 已处理源分辨率变化,但建议在 InitRecordOutputResolution() 处添加注释说明此语义变更,避免后续维护者误解。

● 影响:一般。语义不清可能导致后续维护者在需要动态分辨率场景下错误地依赖 srcFormat

● 建议:在 InitRecordOutputResolution() 函数处添加注释说明 srcFormat 仅用于编码器初始化,不在录制过程中更新:

// srcFormat is only used for encoder initialization in AddStream().
// It is NOT updated from frames during recording.
// For sws output dimensions, use video_st.st->codec->width/height instead.
static void InitRecordOutputResolution(RecordWriteData *recordWriteData)
likedislike
linsanjiu
linsanjiu
Jun 18 Comments:

不采纳。srcFormat 仅在 InitRecordOutputResolution 和 AddStream 使用,写路径已改为 codec->width/height,语义可从调用链看出,暂不增加注释。

linsanjiulinsanjiu
Jun 18 Modify description of pull request
linsanjiulinsanjiu
Jun 18 Change title to "bugfix 分辨率切换时录制概率崩溃", originally titled "fix record".
linsanjiulinsanjiu
Jun 18 Modify description of pull request
72 messages are collapsed here。 See more
openharmony_ciopenharmony_ciCollaborators
Jul 1 Added label: 静态检查成功
openharmony_ciopenharmony_ciCollaborators
Jul 1 Test passed
openharmony_ci
openharmony_ciCollaborators
Jul 1 Comments:

代码门禁通过
您可以通过如下链接查看门禁报告:http://dcp.openharmony.cn/workbench/cicd/detail/6a44825b64650f998bc12e83/runlist

静态检查:

# check type result report
1 codeCheck pass >>>

编译测试:
# Device build result package
1 applicationTPC success >>>

likedislike
openharmony_ciopenharmony_ciCollaborators
Jul 1 Closed associated issue
openharmony_ciopenharmony_ciCollaborators
Jul 1 Merged pull request, merge node SHA: 1d8ca34cb7a40a95e50c91de9eb0e49b7f583f14