Skip to content

MPP_MppResourceGuard

SweerItTer edited this page Feb 1, 2026 · 3 revisions

MppResourceGuard API 文档

概述

MppResourceGuard 是 utilsCore MPP 模块的 RAII 守卫类集合,提供 MPP 资源自动管理功能。

职责

  • MPP 资源自动清理
  • RAII 封装
  • 资源生命周期管理

适用场景

  • 编码器资源管理
  • 解码器资源管理
  • MPP 上下文管理

依赖关系

  • 依赖: Rockchip MPP 库
  • 被依赖: EncoderContext、EncoderCore 等模块

类分析

MppFrameGuard - MppFrame RAII 守卫类

职责与用途

MppFrameGuard 是 MppFrame 的 RAII 封装类,提供:

  • 自动调用 mpp_frame_deinit()
  • 异常安全保证
  • 资源生命周期管理

设计模式

  • RAII: 自动管理资源

MppBufferGuard - MppBuffer RAII 守卫类

职责与用途

MppBufferGuard 是 MppBuffer 的 RAII 封装类,提供:

  • 自动调用 mpp_buffer_put()
  • 异常安全保证
  • 资源生命周期管理

设计模式

  • RAII: 自动管理资源

MppPacketGuard - MppPacket RAII 守卫类

职责与用途

MppPacketGuard 是 MppPacket 的 RAII 封装类,提供:

  • 自动调用 mpp_packet_deinit()
  • 异常安全保证
  • 资源生命周期管理

设计模式

  • RAII: 自动管理资源

公共 API 方法

MppFrameGuard

构造函数

explicit MppFrameGuard(MppFrame* f);

参数说明:

  • f (输入): MppFrame 指针

返回值: 无

所有权归属:

  • MppFrameGuard 拥有资源的管理权

注意事项:

  1. 构造时接管资源
  2. 析构时自动调用 mpp_frame_deinit()

使用例程:

MppFrame frame;
mpp_frame_init(&frame);

MppFrameGuard guard(&frame);

// 使用 frame...

operator->()

MppFrame operator->() const;

返回值: MppFrame

使用例程:

MppFrameGuard guard(&frame);
auto fmt = guard->fmt;

get()

MppFrame get() const;

返回值: MppFrame

使用例程:

MppFrameGuard guard(&frame);
MppFrame f = guard.get();

release()

void release();

返回值: 无

注意事项:

  1. 释放资源管理权
  2. 不再自动清理

使用例程:

MppFrameGuard guard(&frame);
guard.release();
// 现在需要手动清理

MppBufferGuard

构造函数

explicit MppBufferGuard(MppBuffer b);

参数说明:

  • b (输入): MppBuffer 句柄

返回值: 无

所有权归属:

  • MppBufferGuard 拥有资源的管理权

注意事项:

  1. 构造时接管资源
  2. 析构时自动调用 mpp_buffer_put()

使用例程:

MppBuffer buffer;
mpp_buffer_get(NULL, &buffer, size);

MppBufferGuard guard(buffer);

// 使用 buffer...

operator->()

MppBuffer operator->() const;

返回值: MppBuffer

使用例程:

MppBufferGuard guard(buffer);
auto size = guard->size;

get()

MppBuffer get() const;

返回值: MppBuffer

使用例程:

MppBufferGuard guard(buffer);
MppBuffer b = guard.get();

release()

void release();

返回值: 无

注意事项:

  1. 释放资源管理权
  2. 不再自动清理

使用例程:

MppBufferGuard guard(buffer);
guard.release();
// 现在需要手动清理

MppPacketGuard

构造函数

explicit MppPacketGuard(MppPacket* p);

参数说明:

  • p (输入): MppPacket 指针

返回值: 无

所有权归属:

  • MppPacketGuard 拥有资源的管理权

注意事项:

  1. 构造时接管资源
  2. 析构时自动调用 mpp_packet_deinit()

使用例程:

MppPacket packet;
mpp_packet_init(&packet);

MppPacketGuard guard(&packet);

// 使用 packet...

release()

void release();

返回值: 无

注意事项:

  1. 释放资源管理权
  2. 不再自动清理

使用例程:

MppPacketGuard guard(&packet);
guard.release();
// 现在需要手动清理

典型使用场景

场景 1: MppFrame 自动管理

MppFrame frame;
mpp_frame_init(&frame);

{
    MppFrameGuard guard(&frame);
    
    // 使用 frame...
    frame->fmt = MPP_FMT_YUV420SP;
    
}  // 自动调用 mpp_frame_deinit(&frame)

场景 2: MppBuffer 自动管理

MppBuffer buffer;
mpp_buffer_get(NULL, &buffer, 1024);

{
    MppBufferGuard guard(buffer);
    
    // 使用 buffer...
    void* data = mpp_buffer_get_ptr(buffer);
    
}  // 自动调用 mpp_buffer_put(buffer)

场景 3: MppPacket 自动管理

MppPacket packet;
mpp_packet_init(&packet);

{
    MppPacketGuard guard(&packet);
    
    // 使用 packet...
    packet->length = 1024;
    
}  // 自动调用 mpp_packet_deinit(&packet)

场景 4: 异常安全

void encode_frame(MppFrame* frame) {
    MppFrameGuard guard(frame);
    
    // 可能抛出异常的操作
    if (error) {
        throw std::runtime_error("Encode failed");
    }
    
    // 即使抛出异常,资源也会被清理
}

场景 5: 手动管理

MppFrame frame;
mpp_frame_init(&frame);

MppFrameGuard guard(&frame);

// 释放所有权
guard.release();

// 手动清理
mpp_frame_deinit(&frame);

注意事项

  1. 自动清理: 析构时自动清理
  2. 异常安全: 即使异常也会清理
  3. 所有权转移: release() 转移管理权
  4. 指针有效性: 确保指针有效
  5. 避免双重清理: release() 后不要再次析构
  6. 依赖: 需要正确初始化 MPP

相关文档


参考资料

主页

API 文档

DMA 模块

DRM 模块

NET 模块

V4L2 模块

V4L2Param 模块

RGA 模块

MPP 模块

Sys 模块

Mouse 模块

Utils 模块

Clone this wiki locally