1*437bfbebSnyanmisakaMedia Process Platform (MPP) module directory description: 2*437bfbebSnyanmisaka 3*437bfbebSnyanmisakaMPP : Media Process Platform 4*437bfbebSnyanmisakaMPI : Media Process Interface 5*437bfbebSnyanmisakaHAL : Hardware Abstract Layer 6*437bfbebSnyanmisakaOSAL : Operation System Abstract Layer 7*437bfbebSnyanmisaka 8*437bfbebSnyanmisakaRules: 9*437bfbebSnyanmisaka1. header file arrange rule 10*437bfbebSnyanmisakaa. inc directory in each module folder is for external module usage. 11*437bfbebSnyanmisakab. module internal header file should be put along with the implement file. 12*437bfbebSnyanmisakac. header file should not contain any relative path or absolute path, all 13*437bfbebSnyanmisaka include path should be keep in Makefile. 14*437bfbebSnyanmisaka2. compiling system rule 15*437bfbebSnyanmisakaa. for cross platform compiling use cmake as the compiling management system. 16*437bfbebSnyanmisakab. use cmake out-of-source build, final binary and library will be install to 17*437bfbebSnyanmisaka out/ directory. 18*437bfbebSnyanmisaka3. header file include order 19*437bfbebSnyanmisakaa. MODULE_TAG 20*437bfbebSnyanmisakab. system header 21*437bfbebSnyanmisakac. osal header 22*437bfbebSnyanmisakad. module header 23*437bfbebSnyanmisaka 24*437bfbebSnyanmisakaNOTE: 25*437bfbebSnyanmisaka1. Windows support is NOT maintained any more. 26*437bfbebSnyanmisaka2. Mpp support all rockchip chipset now including: 27*437bfbebSnyanmisaka RK29XX/RK30XX/RK31XX 28*437bfbebSnyanmisaka RK3288/RK3368/RK3399 29*437bfbebSnyanmisaka RK3228/RK3229/RK3228H/RK3328 30*437bfbebSnyanmisaka RK3528/RK3528A 31*437bfbebSnyanmisaka RK3562 32*437bfbebSnyanmisaka RK3566/RK3568 33*437bfbebSnyanmisaka RK3588 34*437bfbebSnyanmisaka RV1108/RV1107 35*437bfbebSnyanmisaka RV1109/RV1126 36*437bfbebSnyanmisaka3. Mpp support all format hardware can support except VC1. 37*437bfbebSnyanmisaka4. you can get demo about mpp applied to linux and android. 38*437bfbebSnyanmisaka Liunx : https://github.com/WainDing/mpp_linux_cpp 39*437bfbebSnyanmisaka https://github.com/MUZLATAN 40*437bfbebSnyanmisaka https://github.com/nyanmisaka 41*437bfbebSnyanmisaka Android : https://github.com/c-xh/RKMediaCodecDemo 42*437bfbebSnyanmisaka5. offical github: https://github.com/rockchip-linux/mpp 43*437bfbebSnyanmisaka develop github: https://github.com/HermanChen/mpp 44*437bfbebSnyanmisaka develop gitee : https://gitee.com/hermanchen82/mpp 45*437bfbebSnyanmisaka6. Commit message format should base on https://keepachangelog.com/en/1.0.0/ 46*437bfbebSnyanmisaka 47*437bfbebSnyanmisakaMore document can be found at http://opensource.rock-chips.com/wiki_Mpp 48*437bfbebSnyanmisaka 49*437bfbebSnyanmisaka---- top 50*437bfbebSnyanmisaka | 51*437bfbebSnyanmisaka |----- build CMake out-of-source build directory 52*437bfbebSnyanmisaka | | 53*437bfbebSnyanmisaka | |----- cmake cmake script directory 54*437bfbebSnyanmisaka | | 55*437bfbebSnyanmisaka | |----- android android build directory 56*437bfbebSnyanmisaka | | 57*437bfbebSnyanmisaka | |----- linux linux build directory 58*437bfbebSnyanmisaka | | 59*437bfbebSnyanmisaka | |----- vc10-x86_64 visual studio 2010 on x86_64 build directory 60*437bfbebSnyanmisaka | | 61*437bfbebSnyanmisaka | |----- vc12-x86_64 visual studio 2013 on x86_64 build directory 62*437bfbebSnyanmisaka | 63*437bfbebSnyanmisaka |----- doc design documents of mpp 64*437bfbebSnyanmisaka | 65*437bfbebSnyanmisaka |----- inc header file for external usage, including 66*437bfbebSnyanmisaka | platform header and mpi header 67*437bfbebSnyanmisaka | 68*437bfbebSnyanmisaka |----- mpp Media Process Platform : mpi function private 69*437bfbebSnyanmisaka | | implement and mpp infrastructure (vpu_api 70*437bfbebSnyanmisaka | | private layer) 71*437bfbebSnyanmisaka | | 72*437bfbebSnyanmisaka | |----- base base components including MppBuffer, MppFrame, 73*437bfbebSnyanmisaka | | MppPacket, MppTask, MppMeta, etc. 74*437bfbebSnyanmisaka | | 75*437bfbebSnyanmisaka | |----- common video codec protocol syntax interface for both 76*437bfbebSnyanmisaka | | codec parser and hal 77*437bfbebSnyanmisaka | | 78*437bfbebSnyanmisaka | |----- codec all video codec parser, convert stream to 79*437bfbebSnyanmisaka | | | protocol structure 80*437bfbebSnyanmisaka | | | 81*437bfbebSnyanmisaka | | |----- inc header files provided by codec module for 82*437bfbebSnyanmisaka | | | external usage 83*437bfbebSnyanmisaka | | | 84*437bfbebSnyanmisaka | | |----- dec 85*437bfbebSnyanmisaka | | | | 86*437bfbebSnyanmisaka | | | |----- dummy decoder parser work flow sample 87*437bfbebSnyanmisaka | | | | 88*437bfbebSnyanmisaka | | | |----- h263 89*437bfbebSnyanmisaka | | | | 90*437bfbebSnyanmisaka | | | |----- h264 91*437bfbebSnyanmisaka | | | | 92*437bfbebSnyanmisaka | | | |----- h265 93*437bfbebSnyanmisaka | | | | 94*437bfbebSnyanmisaka | | | |----- m2v mpeg2 parser 95*437bfbebSnyanmisaka | | | | 96*437bfbebSnyanmisaka | | | |----- mpg4 mpeg4 parser 97*437bfbebSnyanmisaka | | | | 98*437bfbebSnyanmisaka | | | |----- vp8 99*437bfbebSnyanmisaka | | | | 100*437bfbebSnyanmisaka | | | |----- vp9 101*437bfbebSnyanmisaka | | | | 102*437bfbebSnyanmisaka | | | |----- jpeg 103*437bfbebSnyanmisaka | | | 104*437bfbebSnyanmisaka | | |----- enc 105*437bfbebSnyanmisaka | | | 106*437bfbebSnyanmisaka | | |----- dummy encoder controllor work flow sample 107*437bfbebSnyanmisaka | | | 108*437bfbebSnyanmisaka | | |----- h264 109*437bfbebSnyanmisaka | | | 110*437bfbebSnyanmisaka | | |----- h265 111*437bfbebSnyanmisaka | | | 112*437bfbebSnyanmisaka | | |----- jpeg 113*437bfbebSnyanmisaka | | 114*437bfbebSnyanmisaka | |----- hal Hardware Abstract Layer (HAL): modules used in mpi 115*437bfbebSnyanmisaka | | | 116*437bfbebSnyanmisaka | | |----- inc header files provided by hal for external usage 117*437bfbebSnyanmisaka | | | 118*437bfbebSnyanmisaka | | |----- iep iep user library 119*437bfbebSnyanmisaka | | | 120*437bfbebSnyanmisaka | | |----- pp post-processor user library 121*437bfbebSnyanmisaka | | | 122*437bfbebSnyanmisaka | | |----- rga rga user library 123*437bfbebSnyanmisaka | | | 124*437bfbebSnyanmisaka | | |----- deinter deinterlace function module including pp/iep/rga 125*437bfbebSnyanmisaka | | | 126*437bfbebSnyanmisaka | | |----- rkdec rockchip hardware decoder register generation 127*437bfbebSnyanmisaka | | | | 128*437bfbebSnyanmisaka | | | |----- h264d generate register file from H.264 syntax info 129*437bfbebSnyanmisaka | | | | 130*437bfbebSnyanmisaka | | | |----- h265d generate register file from H.265 syntax info 131*437bfbebSnyanmisaka | | | | 132*437bfbebSnyanmisaka | | | |----- vp9d generate register file from vp9 syntax info 133*437bfbebSnyanmisaka | | | 134*437bfbebSnyanmisaka | | |----- vpu vpu register generation library 135*437bfbebSnyanmisaka | | | 136*437bfbebSnyanmisaka | | |----- h263d generate register file from H.263 syntax info 137*437bfbebSnyanmisaka | | | 138*437bfbebSnyanmisaka | | |----- h264d generate register file from H.264 syntax info 139*437bfbebSnyanmisaka | | | 140*437bfbebSnyanmisaka | | |----- h265d generate register file from H.265 syntax info 141*437bfbebSnyanmisaka | | | 142*437bfbebSnyanmisaka | | |----- jpegd generate register file from jpeg syntax info 143*437bfbebSnyanmisaka | | | 144*437bfbebSnyanmisaka | | |----- jpege generate register file from jpeg syntax info 145*437bfbebSnyanmisaka | | | 146*437bfbebSnyanmisaka | | |----- m2vd generate register file from mpeg2 syntax info 147*437bfbebSnyanmisaka | | | 148*437bfbebSnyanmisaka | | |----- mpg4d generate register file from mpeg4 syntax info 149*437bfbebSnyanmisaka | | | 150*437bfbebSnyanmisaka | | |----- vp8d generate register file from vp8 syntax info 151*437bfbebSnyanmisaka | | 152*437bfbebSnyanmisaka | |----- legacy generate new libvpu to include old vpuapi path 153*437bfbebSnyanmisaka | | and new mpp path 154*437bfbebSnyanmisaka | | 155*437bfbebSnyanmisaka | |----- test mpp internal video protocol unit test and demo 156*437bfbebSnyanmisaka | 157*437bfbebSnyanmisaka |----- test mpp buffer/packet component unit test and 158*437bfbebSnyanmisaka | mpp/mpi/vpu_api demo 159*437bfbebSnyanmisaka | 160*437bfbebSnyanmisaka |----- out final release binary output directory 161*437bfbebSnyanmisaka | | 162*437bfbebSnyanmisaka | |----- bin executable binary file output directory 163*437bfbebSnyanmisaka | | 164*437bfbebSnyanmisaka | |----- inc header file output directory 165*437bfbebSnyanmisaka | | 166*437bfbebSnyanmisaka | |----- lib library file output directory 167*437bfbebSnyanmisaka | 168*437bfbebSnyanmisaka |----- osal Operation System Abstract Layer: abstract layer 169*437bfbebSnyanmisaka | | for different operation system 170*437bfbebSnyanmisaka | | 171*437bfbebSnyanmisaka | |----- allocator supported allocator including Android ion and 172*437bfbebSnyanmisaka | | Linux drm 173*437bfbebSnyanmisaka | | 174*437bfbebSnyanmisaka | |----- android google's android 175*437bfbebSnyanmisaka | | 176*437bfbebSnyanmisaka | |----- inc osal header file for mpp modules 177*437bfbebSnyanmisaka | | 178*437bfbebSnyanmisaka | |----- linux mainline linux kernel 179*437bfbebSnyanmisaka | | 180*437bfbebSnyanmisaka | |----- windows microsoft's windows 181*437bfbebSnyanmisaka | | 182*437bfbebSnyanmisaka | |----- test OASL unit test 183*437bfbebSnyanmisaka | 184*437bfbebSnyanmisaka |----- tools coding style format tools 185*437bfbebSnyanmisaka | 186*437bfbebSnyanmisaka |----- utils small util functions 187*437bfbebSnyanmisaka 188*437bfbebSnyanmisaka 189*437bfbebSnyanmisakaHere is the mpp implement overall framework: 190*437bfbebSnyanmisaka 191*437bfbebSnyanmisaka +---------------------------------------+ 192*437bfbebSnyanmisaka | | 193*437bfbebSnyanmisaka | OpenMax / gstreamer / libva | 194*437bfbebSnyanmisaka | | 195*437bfbebSnyanmisaka +---------------------------------------+ 196*437bfbebSnyanmisaka 197*437bfbebSnyanmisaka +-------------------- MPP ----------------------+ 198*437bfbebSnyanmisaka | | 199*437bfbebSnyanmisaka | +-------------------------+ +--------+ | 200*437bfbebSnyanmisaka | | | | | | 201*437bfbebSnyanmisaka | | MPI / MPP | | | | 202*437bfbebSnyanmisaka | | buffer queue manage | | | | 203*437bfbebSnyanmisaka | | | | | | 204*437bfbebSnyanmisaka | +-------------------------+ | | | 205*437bfbebSnyanmisaka | | | | 206*437bfbebSnyanmisaka | +-------------------------+ | | | 207*437bfbebSnyanmisaka | | | | | | 208*437bfbebSnyanmisaka | | codec | | OSAL | | 209*437bfbebSnyanmisaka | | decoder / encoder | | | | 210*437bfbebSnyanmisaka | | | | | | 211*437bfbebSnyanmisaka | +-------------------------+ | | | 212*437bfbebSnyanmisaka | | | | 213*437bfbebSnyanmisaka | +-----------+ +-----------+ | | | 214*437bfbebSnyanmisaka | | | | | | | | 215*437bfbebSnyanmisaka | | parser | | HAL | | | | 216*437bfbebSnyanmisaka | | recoder | | reg_gen | | | | 217*437bfbebSnyanmisaka | | | | | | | | 218*437bfbebSnyanmisaka | +-----------+ +-----------+ +--------| | 219*437bfbebSnyanmisaka | | 220*437bfbebSnyanmisaka +-------------------- MPP ----------------------+ 221*437bfbebSnyanmisaka 222*437bfbebSnyanmisaka +---------------------------------------+ 223*437bfbebSnyanmisaka | | 224*437bfbebSnyanmisaka | kernel | 225*437bfbebSnyanmisaka | RK vcodec_service / v4l2 | 226*437bfbebSnyanmisaka | | 227*437bfbebSnyanmisaka +---------------------------------------+ 228*437bfbebSnyanmisaka 229*437bfbebSnyanmisaka 230*437bfbebSnyanmisaka 231*437bfbebSnyanmisakaHere is the Media Process Interface hierarchical structure 232*437bfbebSnyanmisakaMpiPacket and MpiFrame is the stream I/O data structure. 233*437bfbebSnyanmisakaAnd MpiBuffer encapsulates different buffer implement like Linux's dma-buf and 234*437bfbebSnyanmisakaAndroid's ion. 235*437bfbebSnyanmisakaThis part is learned from ff. 236*437bfbebSnyanmisaka 237*437bfbebSnyanmisaka +-------------------+ 238*437bfbebSnyanmisaka | | 239*437bfbebSnyanmisaka | MPI | 240*437bfbebSnyanmisaka | | 241*437bfbebSnyanmisaka +---------+---------+ 242*437bfbebSnyanmisaka | 243*437bfbebSnyanmisaka | 244*437bfbebSnyanmisaka v 245*437bfbebSnyanmisaka +---------+---------+ 246*437bfbebSnyanmisaka | | 247*437bfbebSnyanmisaka +---+ ctx +---+ 248*437bfbebSnyanmisaka | | | | 249*437bfbebSnyanmisaka | +-------------------+ | 250*437bfbebSnyanmisaka | | 251*437bfbebSnyanmisaka v v 252*437bfbebSnyanmisaka +-------+-------+ +-------+-------+ 253*437bfbebSnyanmisaka | | | | 254*437bfbebSnyanmisaka | packet | | frame | 255*437bfbebSnyanmisaka | | | | 256*437bfbebSnyanmisaka +---------------+ +-------+-------+ 257*437bfbebSnyanmisaka | | 258*437bfbebSnyanmisaka | | 259*437bfbebSnyanmisaka | | 260*437bfbebSnyanmisaka | +---------------+ | 261*437bfbebSnyanmisaka | | | | 262*437bfbebSnyanmisaka +---->+ buffer +<----+ 263*437bfbebSnyanmisaka | | 264*437bfbebSnyanmisaka +---------------+ 265*437bfbebSnyanmisaka 266*437bfbebSnyanmisaka 267*437bfbebSnyanmisaka 268*437bfbebSnyanmisakaTake H.264 deocder for example. Video stream will first queued by MPI/MPP layer, 269*437bfbebSnyanmisakaMPP will send the stream to codec layer, codec layer parses the stream header 270*437bfbebSnyanmisakaand generates a protocol standard output. This output will be send to HAL to 271*437bfbebSnyanmisakagenerate register file set and communicate with hardware. Hardware will complete 272*437bfbebSnyanmisakathe task and resend information back. MPP notify codec by hardware result, codec 273*437bfbebSnyanmisakaoutput decoded frame by display order. 274*437bfbebSnyanmisaka 275*437bfbebSnyanmisakaMPI MPP decoder parser HAL 276*437bfbebSnyanmisaka 277*437bfbebSnyanmisaka + + + + + 278*437bfbebSnyanmisaka | | | | | 279*437bfbebSnyanmisaka | open context | | | | 280*437bfbebSnyanmisaka +----------------> | | | | 281*437bfbebSnyanmisaka | | | | | 282*437bfbebSnyanmisaka | init | | | | 283*437bfbebSnyanmisaka +----------------> | | | | 284*437bfbebSnyanmisaka | | | | | 285*437bfbebSnyanmisaka | | init | | | 286*437bfbebSnyanmisaka | +----------------> | | | 287*437bfbebSnyanmisaka | | | | | 288*437bfbebSnyanmisaka | | | init | | 289*437bfbebSnyanmisaka | | +----------------> | | 290*437bfbebSnyanmisaka | | | | | 291*437bfbebSnyanmisaka | | | | open | 292*437bfbebSnyanmisaka | | +-----------------------------------> | 293*437bfbebSnyanmisaka | | | | | 294*437bfbebSnyanmisaka | decode | | | | 295*437bfbebSnyanmisaka +----------------> | | | | 296*437bfbebSnyanmisaka | | | | | 297*437bfbebSnyanmisaka | | send_stream | | | 298*437bfbebSnyanmisaka | +----------------> | | | 299*437bfbebSnyanmisaka | | | | | 300*437bfbebSnyanmisaka | | | parse_stream | | 301*437bfbebSnyanmisaka | | +----------------> | | 302*437bfbebSnyanmisaka | | | | | 303*437bfbebSnyanmisaka | | | | reg generation | 304*437bfbebSnyanmisaka | | +-----------------------------------> | 305*437bfbebSnyanmisaka | | | | | 306*437bfbebSnyanmisaka | | | | send_regs | 307*437bfbebSnyanmisaka | | +-----------------------------------> | 308*437bfbebSnyanmisaka | | | | | 309*437bfbebSnyanmisaka | | | | wait_regs | 310*437bfbebSnyanmisaka | | +-----------------------------------> | 311*437bfbebSnyanmisaka | | | | | 312*437bfbebSnyanmisaka | | | notify_hw_end | | 313*437bfbebSnyanmisaka | | +----------------> | | 314*437bfbebSnyanmisaka | | | | | 315*437bfbebSnyanmisaka | | get_picture | | | 316*437bfbebSnyanmisaka | +----------------> | | | 317*437bfbebSnyanmisaka | | | | | 318*437bfbebSnyanmisaka | | | get_picture | | 319*437bfbebSnyanmisaka | | +----------------> | | 320*437bfbebSnyanmisaka | | | | | 321*437bfbebSnyanmisaka | flush | | | | 322*437bfbebSnyanmisaka +----------------> | | | | 323*437bfbebSnyanmisaka | | | | | 324*437bfbebSnyanmisaka | | flush | | | 325*437bfbebSnyanmisaka | +----------------> | | | 326*437bfbebSnyanmisaka | | | | | 327*437bfbebSnyanmisaka | | | reset | | 328*437bfbebSnyanmisaka | | +----------------> | | 329*437bfbebSnyanmisaka | | | | | 330*437bfbebSnyanmisaka | close | | | | 331*437bfbebSnyanmisaka +----------------> | | | | 332*437bfbebSnyanmisaka | | | | | 333*437bfbebSnyanmisaka | | close | | | 334*437bfbebSnyanmisaka | +----------------> | | | 335*437bfbebSnyanmisaka | | | | | 336*437bfbebSnyanmisaka | | | close | | 337*437bfbebSnyanmisaka | | +----------------> | | 338*437bfbebSnyanmisaka | | | | | 339*437bfbebSnyanmisaka | | | | close | 340*437bfbebSnyanmisaka | | +-----------------------------------> | 341*437bfbebSnyanmisaka + + + + + 342*437bfbebSnyanmisaka 343*437bfbebSnyanmisakaThere are three memory usage modes that decoder can support: 344*437bfbebSnyanmisaka 345*437bfbebSnyanmisakaMode 1: Pure internal mode 346*437bfbebSnyanmisakaIn the mode user will NOT call MPP_DEC_SET_EXT_BUF_GROUP control to decoder. 347*437bfbebSnyanmisakaOnly call MPP_DEC_SET_INFO_CHANGE_READY to let decoder go on. Then decoder will 348*437bfbebSnyanmisakause create buffer internally and user need to release each frame they get. 349*437bfbebSnyanmisaka 350*437bfbebSnyanmisakaAdvantage: 351*437bfbebSnyanmisakaEasy to use and get a demo quickly 352*437bfbebSnyanmisakaDisadvantage: 353*437bfbebSnyanmisaka1. The buffer from decoder may not be return before decoder is close. 354*437bfbebSnyanmisaka So memory leak or crash may happen. 355*437bfbebSnyanmisaka2. The decoder memory usage can not be control. Decoder is on a free-to-run 356*437bfbebSnyanmisaka status and consume all memory it can get. 357*437bfbebSnyanmisaka3. Difficult to implement zero-copy display path. 358*437bfbebSnyanmisaka 359*437bfbebSnyanmisakaMode 2: Half internal mode 360*437bfbebSnyanmisakaThis is the mode current mpi_dec_test code using. User need to create 361*437bfbebSnyanmisakaMppBufferGroup according to the returned info change MppFrame. 362*437bfbebSnyanmisakaUser can use mpp_buffer_group_limit_config to limit decoder memory usage. 363*437bfbebSnyanmisaka 364*437bfbebSnyanmisakaAdvantage: 365*437bfbebSnyanmisaka1. Easy to use 366*437bfbebSnyanmisaka2. User can release MppBufferGroup after decoder is closed. 367*437bfbebSnyanmisaka So memory can stay longer safely. 368*437bfbebSnyanmisaka3. Can limit the memory usage by mpp_buffer_group_limit_config 369*437bfbebSnyanmisakaDisadvantage: 370*437bfbebSnyanmisaka1. The buffer limitation is still not accurate. Memory usage is 100% fixed. 371*437bfbebSnyanmisaka2. Also difficult to implement zero-copy display path. 372*437bfbebSnyanmisaka 373*437bfbebSnyanmisakaMode 3: Pure external mode 374*437bfbebSnyanmisakaIn this mode use need to create empty MppBufferGroup and import memory from 375*437bfbebSnyanmisakaexternal allocator by file handle. 376*437bfbebSnyanmisakaOn Android surfaceflinger will create buffer. Then mediaserver get file handle 377*437bfbebSnyanmisakafrom surfaceflinger and commit to decoder's MppBufferGroup. 378*437bfbebSnyanmisaka 379*437bfbebSnyanmisakaAdvantage: 380*437bfbebSnyanmisaka1. Most efficient way for zero-copy display 381*437bfbebSnyanmisakaDisadvantage: 382*437bfbebSnyanmisaka1. Difficult to learn and use. 383*437bfbebSnyanmisaka2. Player work flow may limit this usage. 384*437bfbebSnyanmisaka3. May need external parser to get the correct buffer size for the external 385*437bfbebSnyanmisaka allocator. 386*437bfbebSnyanmisaka 387*437bfbebSnyanmisakaThe required buffer size caculation: 388*437bfbebSnyanmisakahor_stride * ver_stride * 3 / 2 for pixel data 389*437bfbebSnyanmisakahor_stride * ver_stride / 2 for extra info 390*437bfbebSnyanmisakaTotal hor_stride * ver_stride * 2 will be enough. 391*437bfbebSnyanmisaka 392*437bfbebSnyanmisakaFor H.264/H.265 20+ buffers will be enough. 393*437bfbebSnyanmisakaFor other codec 10 buffers will be enough. 394