自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

StephenZhou

真正的男人就像孤独的 ROSHAN ,即使被伤的再深,都会再一次爬起来并且把不朽的祝福送给那个曾经伤害过他的人

  • 博客(254)
  • 资源 (15)
  • 收藏
  • 关注

原创 E: 仓库 “http://mirrors.aliyun.com/ubuntu eoan Release” 没有 Release 文件 —— 解决方案

E: 仓库 “http://mirrors.aliyun.com/ubuntu eoan Release” 没有 Release 文件解决方案

2023-01-04 23:48:31 3583 2

原创 Qt 集成 FFmpeg 实现颜色格式转换

由于输入输出为纯图片文件,所以需要指定图像的宽高信息;

2022-10-30 22:22:51 1647 3

转载 H.264 入门篇 - 14 (去块滤波)

H264视频编码标准中,在解码器反变换量化后会出现块效应。

2022-10-16 11:09:45 1490 1

原创 H.264 入门篇 - 13 (POC 求解)

POC(picture order counts)用来表示解码帧显示顺序,当码流中存在B帧时,解码顺序和显示顺序不一样,视频帧显示时需要根据 POC 重排顺序,否则会出现跳帧、画面不连贯。比如,对于IPBB这项顺序的视频序列,解码顺序为 I-P-B-B,但它的显示顺序为 I-B-B-P。

2022-10-16 11:09:25 1567

原创 H.264 入门篇 - 12 (帧间预测 - MVP 求解)

H.264 利用相邻帧之间的相似性,用参考帧(可能多参考帧)和目标帧之间,以宏块为基本单位进行帧间预测在帧间预测编码模式下,每个块都有一个或两个 mv 需要编码。当采用小尺寸编码时,一个宏块内需要编码的 mv 也越多,所需比特额越多。同时,mv 有两个值并且以1/4像素为单位,这也就意味着mv的数值还不小,因此有必要对 mv 进行压缩。H.264 标准利用mv 的相关性对当前块 mv 进行预测,只对实际 mv 与预测 mv(mvp)的差值 mvd 进行编码。

2022-10-16 11:09:05 2983

原创 H.264 入门篇 - 11 (帧间预测 - DPB 管理策略)

虽然说 DPB 中也可以存储非参考图像,在DPB没满的时候,会无差别地把参考图像与非参考图像一并插入DPB中;DPB 对解码图像的存储有个策略:更倾向于存储对后面编码有用的图像(也就是参考图像)。

2022-10-16 11:08:38 703

原创 H.264 入门篇 - 10 (帧间预测 - 参考帧列表修改/重排)

低版本的 H.264 定义了这个过程为重排:slice_header->ref_pic_list_reordering() 过程高版本的 H.264 定义了这个过程为修改:slice_header->ref_pic_list_modification() 过程通过比较高低版本的 SPEC,slice_header->ref_pic_list_reordering() 过程和 slice_header->ref_pic_list_modification() 过程高度相似,几乎没有区别;

2022-10-16 11:08:09 1227

原创 H.264 入门篇 - 09 (帧间预测 - 参考帧列表)

短期和长期的关系和区别:在一个解码器中的 DPB(参考帧缓存)大小总是有限的,所以引入一个问题,什么样的参考帧会被保存到 DPB 中,什么样的参考帧会被移除出去,因此将分为长期和短期参考帧,所谓短期参考帧是这帧不会长期驻留在DPB中,如果参考帧缓存已满或者有其他特定的条件,那么短期参考帧就会被从DPB中移除;与之相对的长期参考帧,只要没有遇到某个指定的条件,遇到某个IDR帧, 遇到了清空整个DPB的指令等等,那么长期参考帧会长期在DPB中,不会因为有新的参考帧而被冲刷掉;(P帧是按照编码顺序)

2022-10-15 23:22:17 2764

原创 H.264 入门篇 - 08 (帧间预测 - 已解码参考帧的标记)

前面我们知道了,编码过程中,会将已编码的图像进行解码,然后放入到 DPB 缓存,用于后续的使用;放入到 DPB。

2022-10-15 23:13:40 1625 1

原创 H.264 入门篇 - 07 (帧间预测 - 解码图像缓存 DPB)

当解码器收到一个IDR帧时会立即将DPB清空,因为H.264协议规定一个IDR帧之后的任何帧都不会引用该IDR之前的任何帧,所以DPB中的数据已失效,可以清空。在做视频解码时,需要将最近的若干幅参考帧缓存起来,这个缓冲区就叫做 DPB。解码已经完成的图像被缓存在 DPB 中,供后续帧用作参考图像,因此,解码器需要按照一定的规则对DPB中的图像进行管理。滑动窗 是以 DPB 可以存放的帧数为窗口,随着当前解码的图像,以先入先出的方式,将新的解码图像移入,将超出窗口的解码图像移出。

2022-10-15 23:02:03 1974

原创 H.264 入门篇 - 06 (帧间预测 - 运动估计)

H.264 编码中,帧间压缩办法,是通过帧间估计相关一系列方式来实现;首先,这里指基于宏块(macroblock)的运动估计,基本思想是将图像序列的每一帧分成许多互不重叠的块,并认为块内所有像素的位移量都相同,然后对每个宏块到参考帧某一特定搜索范围内根据一定的块匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。运动估计的主要任务是在历史参考帧当中为当前正在编码的宏块找到一个匹配块。

2022-10-15 22:47:38 2826

原创 H.264 入门篇 - 05 (帧内预测)

16×16模式的DC预测模式同4×4模式的DC预测方法类似,判断左侧16个像素和上方16个像素的有效性,将其中有效部分的均值作为整个预测块的像素值。如果32个像素都无效,则预测块像素值为( 1。本过程的输入是去块效应滤波过程之前的重建样点值,以及对于 Intra_N×N 预测模式(其中 N×N 等于 4×4 或 8×8)下相邻宏块的 IntraNxNPredMode 值。该模式下,16x16宏块中的亮度块,可分为16个4x4块,每个4x4块都使用Intra_4x4预测方式。

2022-10-15 19:11:02 2986 3

原创 H.264 入门篇 - 04 (B_Skip、P_Skip 、B_Direct宏块)

以上就是P帧SKIP的想法。要注意的是 B 片中有一种类型的宏块:B_Direct_16x16,它很特殊,它的名字里有“Direct”这个单词 ,它的预测方式也采用的 Direct 方式。这种类型的宏块即有 B 片中的 Skip 宏块的特性(MV 采用 Direct 预测方式得到),同时又有一般帧间宏块的特性(有像素残差,Skip 宏块是没有像素残差的)。B_Direct_8x8 类型块(大小为 8x8)和 B_Direct 类型宏块(大小为 16x16)都采用的是 Direct 预测模式;

2022-10-15 18:56:37 1382

原创 H.264 入门篇 - 03 (宏块类型)

子宏块即 8x8 块,一个16x16的宏块分为4个子宏块,每个子宏块类型表示都是一个8x8块的分割、预测方式,因此,采用子宏块预测的宏块其语法结构中会有4个子宏块类型。MbPartPredMode(mb_type,0) 宏块分割后的第一部分的预测模式为前向预测,还是后向预测,还是双向预测,由于是 P slice,这里只能是前向预测 Pred_L0。如果当前宏块类型采用的预测方式为 Intra_16x16,那么该字段有效,它用0~3表示了 Intra_16x16中的 4 种模式,请参考。

2022-10-15 18:52:48 1923

原创 H.264 入门篇 - 02 (帧内预测相邻像素推导)

帧内预测的时候,需要根据相邻像素宏块来预测当前块的像素值,以 Intra_4x4 为例,如下图所示,需要用到的13个相邻像素值,那么如何获取这13个像素值?本文要主要说明如何获取帧内预测所用到的相邻像素。对应参考文档6.4.5-6.4.9小节内容。在此之前需要先知道宏块地址是否可用,如果宏块地址不可用,则在该宏块的相邻像素也都不可用。

2022-10-15 18:42:38 1175

原创 H.264 入门篇 - 01 (Bitstream)

前面说了编码器将连续的帧经过分割,预测,变换(DCT),量化,去块滤波,熵编码后,就可以出正常的码流了,但这仅仅是裸的数据,我们还需要将编码器的编码过程信息经过最后一步,打包到最终的比特文件,才形成最终符合 H.264 标准的码流文件;

2022-10-15 18:10:19 3659 2

原创 H.264 入门篇 - 00 (简介)

(最新版本)(2005 版本,带中文)H.264 的多媒体视频 Codec 规范由 ITU-T 和 ISO/IEC联合开发;ITU-T 给这个标准命名为 H.264(以前叫做H.26L),而ISO/IEC 称它为 MPEG-4 高级视频编码(Advanced Video Coding,AVC),并且它将成为MPEG-4标准的第10部分。

2022-10-15 12:14:07 3066

原创 VideoCodec 入门篇 - 00 (编解码简介)

冗余信息指的是一帧或者多帧之间的多余信息,比如,一帧图片内的信息,很多都是蓝色,那么是否可以考虑用一个蓝色就来编码其他部分的内容信息呢?比如一个码流,有连续 N 帧的内容都是静止或者变化不多的,那这之间的每帧信息都有大量的重复冗余信息;

2022-10-06 12:01:36 24841 10

原创 LVGL (12) Areas 合并与更新

目录区域之间的关系独立区域大面积重叠区域小面积重叠包含超出屏幕代码调用在 LVGL 中,区域被定义为 lv_area_t 结构体,它通过 x1, y1, x2, y2,来代表一个矩形的区域;/** Represents an area of the screen.*/typedef struct { lv_coord_t x1; lv_coord_t y1; lv_coord_t x2; lv_coord_t y2;} lv_area

2022-05-06 00:39:37 4091 7

原创 LVGL (11) 更新 Layout 依据

LVGL 是以 obj 为基础衍生出来的一套绘制;每个 obj 都包含了 2 个字段:layout_inv / scr_layout_inv;typedef struct _lv_obj_t {...... uint16_t layout_inv : 1; // 改 obj 的 layout 是否需要更新 uint16_t scr_layout_inv : 1; // screen 的 layout 是否需要更新......} lv_obj_t;可以看到,

2022-05-06 00:34:56 2233

原创 LVGL (10) 移植流程

目录1、下载源码2、目录结构介绍3、移植前注意事项4、开始移植4.1、改文件名字4.1.1、对接 platform/chip 的部分4.1.2、LVGL 配置文件4.2、移植显示驱动4.3、配置 LVGL4.3.1、屏幕尺寸的配置4.3.2、颜色相关配置4.3.3、内存相关配置4.3.4、底层的配置4.3.5、日志4.3.6、其他(显示帧率等)4.3.7、编译属性4.3.8、裁剪组件4.3.9、开启/关闭 Demo4.4、加入文件到

2022-05-06 00:32:13 15734 14

原创 LVGL (9) Event 机制实现

Event PreviewLVGL 中包含了一个 Event 事件子系统,并定义了很多事件:/** * Type of event being sent to the object. */typedef enum { LV_EVENT_ALL = 0, /** Input device events*/ LV_EVENT_PRESSED, /**< The object has been pressed*/ LV_EVENT_P

2022-05-06 00:19:04 5887 2

原创 LVGL (8) 绘制流程

Preview整个 LVGL Framework 的运转,都是基于 LVGL 中定义的所谓的 ”Timer“ 定时器的,系统需要给 LVGL 一个 ”心跳“,LVGL Framework 才可以正常的运转起来;基于这样的一个框架,LVGL 定义了两个函数,需要与系统进行对接:lv_tick_inc:用于系统告知 LVGL 时间; lv_timer_handler:用于处理 LVGL 的 timer 事件典型的做法是,SystemTick 中调用 lv_tick_inc 来告知 LVGL 时间

2022-05-06 00:12:50 10380 9

原创 LVGL (7) 显示对接

目录LVGL 显示缓冲区LVGL 显示驱动小结lv_disp_drv_register 分析lv_disp_drv_init 分析lv_disp_drv_register 分析注意LVGL 是 GUI 的图形绘制库,既然是图形绘制,那么就需要考虑 2 点:开辟绘制的 buffer; 对接底层实际绘制到屏幕的驱动;LVGL 显示缓冲区在 LVGL v8 上,用于绘制的 buffer,使用 lv_disp_draw_buf_t 结构体进行描述:/** * St

2022-05-05 23:57:39 6112 6

原创 LVGL (6) 基础对象 Obj 分析

LVGL 中使用 lv_obj_t 来对常用的对象进行抽象:typedef struct _lv_obj_t { const lv_obj_class_t * class_p; struct _lv_obj_t * parent; _lv_obj_spec_attr_t * spec_attr; _lv_obj_style_t * styles;#if LV_USE_USER_DATA void * user_data;#endif lv_area_...

2022-05-05 23:47:00 3986 5

原创 LVGL (5) GC 全局变量定义

LVGL 中,有一个 lv_gc.h 文件,代码中很多全局变量都是在这里定义的:#define LV_DISPATCH(f, t, n) f(t, n)#define LV_DISPATCH_COND(f, t, n, m, v) LV_CONCAT3(LV_DISPATCH, m, v)(f, t, n)#define LV_DISPATCH00(f, t, n) LV_DISPATCH(f, t, n)#define LV_DISPATCH01(f,...

2022-05-05 23:41:55 2079

原创 LVGL (4) 对齐

参考对齐LVGL 可以指定对象的对齐方式,以及参考的对齐,比如:参照父对象对齐; lv_obj_set_align(obj, LV_ALIGN_...); 参照父对象对齐后,在设置坐标位置; lv_obj_align(obj, LV_ALIGN_..., x, y); 参照另一个对象(无父子关系)对齐后,设置坐标位置; lv_obj_align_to(obj_to_align, obj_referece, LV_ALIGN_..., x, y); 对齐的类型...

2022-05-05 23:40:05 2250

原创 LVGL (3) 盒子模型

LVGL 遵循 CSS 的 border-box 模型。 对象的“盒子”由以下部分构成:边界(bounding):元素的宽度/高度围起来的区域(整个盒子)。 边框(border):边框有大小和颜色等属性(相当于盒子的厚度和它的颜色)。 填充(padding):对象两侧与其子对象之间的空间(盒子的填充物)。 内容(content):如果边界框按边框宽度和填充的大小缩小,则显示其大小的内容区域(盒子实际装东西的区域)。 轮廓(outline) :LVGL中没有外边距(margin)的概念(盒子之间的

2022-05-05 23:39:02 1882

原创 LVGL (2) 图层

LVGL 具有图层(Layer)的概念,默认规则是最后创建的在最上层,一般我们都是使用在 lv_scr_act 层上面创建各种控件(widgets),每个控件其实就相当于一个个小小的图层展示在屏幕上。在 lv_scr_act 之上还有另外两个层 top_layer 和 sys_layer,这是两个特殊的层。两者在显示器的所有屏幕上都是可见的和通用的。但是,它们不会在多个物理显示器之间共享。 top_layer 始终位于默认屏幕 (lv_scr_act()) 的顶部,而 sys_layer 位于 top_

2022-05-05 23:37:33 4569 2

原创 LVGL (1) 介绍

LVGL 是现在非常流行的嵌入式 GUI 图形库,它一方面是纯 C 语言实现,易于移植,性能较好,同时支持的空间和内容较为丰富,得到了广泛的应用;LVGL 不但支持了显示(display),还同时支持了 input 设备,包括了触摸,键盘等;LVGL 支持的特性功能强大的构建块,例如按钮,图表,列表,滑块,图像等。 带有动画,抗锯齿,不透明,平滑滚动的高级图形 各种输入设备,例如触摸板,鼠标,键盘,编码器等 支持UTF-8编码的多语言 多显示器支持,如TFT,单色显示器 完全可定制的图形元

2022-05-05 23:34:01 9792 2

原创 MIPI 系列之 DCS

目录1、Display Architectures2、Power Level Definition3、Display Command Set4、Command List5、Command Accessibility6、Default Modes and Values7、Command Descriptions7.1、enter_idle_mode7.2、set_page_address7.3、set_column_addressMIPI 协议族,定义了一个专门

2022-03-31 00:29:57 6190

原创 MIPI 系列之 DBI

在 MIPI 协议族种,之前晒了 DPI,和 DPI 对应的是 DBI;MIPI DBI 的全称为 Display Bus Interface,是用于主机到显示设备的的一种数据传输标准;显示设备的话,分为很多种不同的类型,有的显示设备本身内部不带 Framebuffer,那么就需要主机不停的给显示设备送数据;还有的显示设备,它内部集成了 Framebuffer,主机只需要发送一帧的数据过去,然后主机就可以休息了,显示设备控制芯片那端的 Framebuffer 会自动的按照刷新率往显示上送;DBI 的

2022-03-29 16:56:45 3069 4

原创 MIPI 系列之 DPI

在 MIPI 协议族种,除了 DSI(用于显示)、CSI(用于摄像头)以外,还有几个概念会经常的涉及到,这里把它们拎出来晒一下,免得有盲区;MIPI DPI 的全称为Display Pixel Interface,是用于主机到显示设备的的一种数据传输标准;显示设备的话,分为很多种不同的类型,有的显示设备本身内部不带 Framebuffer,那么就需要主机不停的给显示设备送数据;还有的显示设备,它内部集成了 Framebuffer,主机只需要发送一帧的数据过去,然后主机就可以休息了,显示设备控制芯片那端.

2022-03-29 00:09:47 5572

原创 MIPI 系列之 DSI

MIPI 是拿来干嘛的,这个不用过多解释,简单的说,就是一个由若干芯片厂商组成的组织,旨在制定一系列的高速总线,来解决 CPU 中的一些外设互联互通的问题;MIPI 制定了很多总线,有些用于现在应用得比较多的是 MIPI 的 CSI 和 DSI 接口;CSI 是用于摄像头和主控 CPU 通信的接口,可以简单的理解为视频输入接口;DSI 是用于将图形图像数据输出到显示设备的 Display 接口;这里我们暂时关注 MIPI-DSI 接口,即,用于将图形图像数据输出到显示设备;老规矩,我们会

2022-03-28 18:10:11 13937 8

原创 MIPI 系列之 D-PHY

MIPI 接口广泛用于摄像头,和显示部分;PHY 属于 MIPI 接口的最底层部分,也就是物理层,直接涉及到物理连线,信号传输等等,要搞清楚 MIPI 的数据传送,那么从 PHY 入手了解,是一个不错的选择;既然是 PHY,那么肯定在 PHY 层上,还搭建了其他的硬件层次结构,这里暂时只关注 PHY 层,后面会结合更加上层的逻辑来分析;在 PHY 上,只负责定义数据物理层的收发标准;MIPI 的 PHY 分为了 3 种:D-PHY C-PHY M-PHY他们之前有什么区别和联系呢?

2022-03-22 19:50:16 12586 36

原创 u-boot (3) —— spl

u-boot 里面,有一个叫做 SPL 的东东,你在看 u-boot 代码的时候,很多地方都可以看到和他相关的东西,这里聊一下这玩意到底是拿来干啥用的;1、SPL 名字由来SPL 全称叫做:Secondary Program Loader,看名字,像是一个什么二级加载相关的;实质上,也是二级加载;众所周知,u-boot 是用来 boot 我们的嵌入式系统的,那直接使用 u-boot 就行了呗,为何还会多出一个 uboot spl 呢?那我们从系统启动开始说起吧;站在芯片厂商的角度来说,硬

2022-02-25 23:22:48 4897 12

原创 u-boot (2) —— 链接分析

前面讲了 u-boot 的编译分析,编译完以后,需要将 .o、.a 进行链接成为最后的 u-boot 的 elf 文件;在上一章里面(u-boot (1) —— 编译分析)提到了 Makefile 错综复杂的包含关系;链接的时候,我们注意几点:Makefile 包含了它源码目录下的那个 config.mk 文件,其中需要注意的:# Load generated board configurationsinclude $(OBJTREE)/include/autoconf.mkifdef

2022-02-22 23:54:27 1107

原创 u-boot (1) —— 编译分析

uboot 是什么不用多说了,是用于引导系统启动的 bootloader,配置完基本硬件后,把代码 Copy 到内存,引导内核启动;现在基于 Exynos 4412 环境来分析 uboot;既然是彻底分析,那么就从编译部分开始吧;首先还是看 uboot 目录下的 Makefile,这个是整个 uboot 编译的入口;为了支持多种不同的体系架构引导启动,以及各式各样的流程,uboot 源码中包含了几乎所有常见的 CPU 体系架构,包括 ARM,X86,MIPS,PowerPC;这款Exynos .

2022-02-21 00:11:29 2629 3

原创 GNU Linker

目录1、铺垫1.1、预编译1.2、编译1.3、汇编1.4、链接2、GNU ld2.1、binutils2.2、Linker script2.2.1、基本语法2.2.2、定义入口 ENTRY2.2.3、定义 MEMORY2.2.4、定义 MEMORY 别名2.2.5、定义文件格式2.2.6、定义输出文件的架构2.2.7、对齐2.2.8、其他2.3、例子3、ld 命令和参数GNU Linker 链接器(ld)是用于将程序目标文件(.

2022-02-17 16:28:41 1698

原创 GNU Makefile

从工作就接触 make,但还从未仔细仔细看过官方的文档描述和说明,有些小遗憾,现在补充补充;GNU 的 make Manual:Top (GNU make)Top (GNU make)https://www.gnu.org/software/make/manual/html_node/index.html最好最好还是读一读,虽然常用到,但是,总有一些很小的细节需要注意,稍不注意就可能遗漏;Makefile 用于描述代码的编译、链接、生成最终目标文件的过程和相互依赖;当你写好一个 Makefile

2022-02-10 10:55:07 3002 1

CSC 工具,用于图像格式的转换

CSC 工具,用于图像格式的转换

2022-10-29

MIPI Spec 资源整合,包含 DBI/DPI/DSI/CSI/DCS

MIPI Spec 资源整合,包含 DBI/DPI/DSI/CSI/DCS 的官方协议相关内容

2022-03-28

陈皓版-跟我一起写Makefile

陈皓版-跟我一起写Makefile,根据 GNU Makefile 文档的描述进行中文的介绍

2022-02-06

USB 2.0 协议规范

USB官方的 USB 2.0 specification 协议规范,包含了协议规范,电器特性等等内容。

2019-12-02

QT 实现的串口收发 exe 文件

QT 实现的串口收发 exe 文件,实现了基本的配置和串口的收发 exe 文件

2019-09-24

用 QT 实现的串口收发程序

用 QT 实现的串口收发程序,基本功能实现,能够通过设置基本属性,打开串口并进行数据收发

2019-09-24

QT 实现的64bit十六进制与十进制相互转换工具,带 bitmap 配置显示

QT 实现的 64 bit 十六进制与十进制实时相互转换工具,带 bitmap 配置显示,方便进行寄存器位的配置

2019-05-07

Linux4.0的设备驱动开发详解(宋老师)

本书是 Linux 4.0 版本的设备驱动开发详解的书籍,宋老师出品,必是精品

2019-05-07

奔跑吧Linux

讲解 Linux Kernel 的较为新的版本的机制,其中包含了比较新的进程调度相关内容

2019-02-16

Linux设备驱动开发详解

Linux设备驱动开发详解的 pdf 文件,主要描述Linux下常用驱动原理

2019-01-30

深入理解Linux虚拟内存管理

深入理解Linux虚拟内存管理的 pdf 文件。主要讲述内存相关内容

2019-01-30

深入Linux设备驱动程序内核机制.pdf

深入Linux设备驱动程序内核机制.pdf,带目录结构的高清版本

2019-01-27

Linux内核设计与实现_第三版_中文版pdf

Linux内核设计与实现_第三版_中文版的 pdf,带目录结构

2019-01-27

USB_HID_Spec_V1.11

USB 官方的 HID 说明文档,文档中详细说明了 HID 相关的特性和描述 HID 的描述符合 Report 描述符

2018-09-06

STM32F103 的 SDIO 对应 SDCard V2.00 版本 Spec

STM32F103 的 SDIO 对应 SDCard V2.00 版本 Spec 说明

2018-09-06

STM32中文参考手册_V10

STM32中文参考手册,中文描述,详细讲解了 STM32F103xxx的基本构成以及访问接口

2018-06-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除