webrtcSrcAnalyze

[TOC]

TURN服务器测试网站验证
https://blog.piasy.com/2018/05/24/WebRTC-Video-Native-Journey/index.html
https://github.com/barry-ran/learn-webrtc/tree/master/doc
音频开发
webrtc学习笔记四:Webrtc源码目录结构
Webrtc官方网址:https://webrtc.org/
Webrtc老版官网地址:https://webrtc.github.io/webrtc-org/
Webrtc学习网址:https://webrtc.org.cn/
Webrtc中文文档https://github.com/RTC-Developer/WebRTC-Documentation-in-Chinese
W3C API文档:https://www.w3.org/TR/webrtc/
RTSP stream
WebRTC Custom OpenCV Video Capture
https://webrtchacks.com/
WebRTC data channels - HTML5 Rocks
WebRTC in the real world: STUN, TURN and signaling …
webrtc-自定义视频流-分析篇
webrtc-自定义视频流-实现篇(基于release-54)
WebRTC视频采集模块和数据流水线建立- 简书
Capture a MediaStream From a Canvas, Video or Audio …
RTCVideoCapturer
WebRTC的apprtc和collider源码分析
Colllider源码分析

webrtc 架构

2

目录结构

webrtc是架构分层的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594

$ tree -d -L 2
.
├── api webrtc的接口层。比如浏览器、我们自己写的应用程序大多数时候都是直接从webrtc提供的这些api进行调用。如果我们想增加接口或者调整接口,就需要到api目录下去找相应的文件
│   ├── adaptation
│   ├── audio
│   ├── audio_codecs
│   ├── call
│   ├── crypto
│   ├── neteq
│   ├── rtc_event_log
│   ├── stats
│   ├── task_queue
│   ├── test
│   ├── transport
│   ├── units
│   ├── video
│   ├── video_codecs
│   └── voip
├── audio # 与音频相关的逻辑。
│   ├── test
│   ├── utility
│   └── voip
├── base
│   ├── allocator
│   ├── android
│   ├── containers
│   ├── debug
│   ├── files
│   ├── fuchsia
│   ├── hash
│   ├── i18n
│   ├── ios
│   ├── json
│   ├── mac
│   ├── memory
│   ├── message_loop
│   ├── metrics
│   ├── nix
│   ├── numerics
│   ├── posix
│   ├── power_monitor
│   ├── process
│   ├── profiler
│   ├── sampling_heap_profiler
│   ├── strings
│   ├── synchronization
│   ├── system
│   ├── task
│   ├── test
│   ├── third_party
│   ├── threading
│   ├── time
│   ├── timer
│   ├── trace_event
│   ├── util
│   └── win
├── build
│   ├── android
│   ├── args
│   ├── chromeos
│   ├── cipd
│   ├── config
│   ├── docs
│   ├── fuchsia
│   ├── internal
│   ├── ios
│   ├── linux
│   ├── mac
│   ├── sanitizers
│   ├── toolchain
│   ├── util
│   └── win
├── build_overrides
├── buildtools
│   ├── android
│   ├── checkdeps
│   ├── clang_format
│   ├── linux64
│   ├── mac
│   ├── third_party
│   └── win
├── call # 数据流的管理层,Call代表同一个端点的所有数据的流入流出,那当有多个端进行流入流出的时候就需要有多个Call。主要是对音频流、视频流的管理,当与对端建立连接之后,同一个端的这些流的管理就是通过call进行管理的。
│   ├── adaptation
│   └── test
├── common_audio
│   ├── include
│   ├── mocks
│   ├── resampler
│   ├── signal_processing
│   ├── third_party
│   └── vad
├── common_video
│   ├── generic_frame_descriptor
│   ├── h264
│   ├── include
│   ├── libyuv
│   └── test
├── data
│   ├── audio_processing
│   └── voice_engine
├── docs
│   └── native-code
├── examples
│   ├── aarproject
│   ├── androidapp
│   ├── androidjunit
│   ├── androidnativeapi
│   ├── androidtests
│   ├── objc
│   ├── objcnativeapi
│   ├── peerconnection
│   ├── stunprober
│   ├── stunserver
│   ├── turnserver
│   └── unityplugin
├── ios
│   ├── build
│   ├── chrome
│   ├── components
│   ├── net
│   ├── public
│   ├── showcase
│   ├── testing
│   ├── third_party
│   ├── web
│   └── web_view
├── logging
│   └── rtc_event_log
├── media #与多媒体相关的逻辑处理,如编解码的逻辑处理。比如什么时候进行编码,什么时候进行解码这些都是在media目录下控制的。
│   ├── base
│   ├── engine
│   └── sctp
├── modules #重中之重!!!!!!!!!!!
│   ├── audio_coding #音频编解码器相关代码
./modules/audio_coding/audio_network_adaptor/bitrate_controller.h
./modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
./modules/audio_coding/audio_network_adaptor/bitrate_controller.cc
码率控制的相关代码。控制码流是500K,1M,还是2M,这个码流的控制就是在这个目录下。想改变码流,想看码流相关的控制,就进入这个目录下即可
│   ├── audio_device #音频采集与音频播放相关的代码
│   ├── audio_mixer #混音相关

│   ├── audio_processing #音频前后处理的相关代码。对音频的前处理,后处理;比如回音消除,降噪,增益等等
│   ├── congestion_controller # 流量控相关代码。当检测到网络流量比较高的时候,需要做一些网络流量控制,防止网络包把带宽打死,具体怎么控制就是在这里设置的,想要看流控相关的代码就在这个目录中查看。
│   ├── desktop_capture #桌面采集相关,win,linux,mac目录下,如图所示
│   ├── include
│   ├── pacing #pacing目录:码率探测及平滑处理相关的代码。首先需要检测到音频视频的码率是多少,检测到后做一个平滑的处理,就是不是让数据一下发送出去,需要做平滑处理,比如有时候是10K,有时候是500K,给做一个平均,不能一会儿高一会儿低,而是给做一个平滑处理
│   ├── remote_bitrate_estimator #emote_bitrate_estimator目录:远端码率估算相关代码。评估远端能接收的带宽是多少,不是我本地的发送的带宽,是远程接收端的估算带宽。不仅仅需要知道发送端单位时间能发送多少,还需要知道对方端单位时间能收多少,所以需要一个远端码率的评估。评估的代码就在这个目录下。
│   ├── rtp_rtcp #rtp/rtcp协议相关代码
│   ├── third_party
│   ├── utility
│   ├── video_capture #视频采集相关的代码。捕获视频相关的代码 平台无关的代码在该直接目录下
│   ├── video_coding #视频编解码器相关的代码。视频的编码器VP8/VP9等等,编码器都是放在这里的。
│   └── video_processing #视频前处理、后处理相关的代码。视频帧的增强,检测,还有如果增加人脸识别就可以放在这个目录下。
├── out
│   ├── Aios64
│   └── ios
├── p2p # 端到端相关代码,stun/turn。端到端要进行传输的时候需要看p2p是不是能打通,p2p有很多类型,链接能不能打通,相应的侦测工具都是在这个p2p目录下。相应的协议有STUN协议TURN协议。
│   ├── base
│   ├── client
│   └── stunprober
├── pc # Peer Connection,连接相关的逻辑层。Peer Connection代表的是与对端的一个连接,在上层有一个连接的概念,在连接下面就有很多的东西了,比如连接的时候有stream流,流里面又有轨track,一个流里面可以有很多轨,包括音频轨、视频轨、桌面轨等等,轨道的概念就可以理解为两个平行的线,是不相交叉,音频、视频都是单独的,这样一个概念。通过Peer Connection拿到Stream流,流里能拿到每一个多媒体,也就是音频视频,当然还可以拿到所有的统计信息,比如媒体流的统计信息、传输的统计信息等等。 Peer Connection是一个非常重要的目录,相当于上层接口的一个统一的接口层
│   ├── scenario_tests
│   └── test
├── resources
│   ├── audio_coding
│   ├── audio_device
│   ├── audio_processing
│   ├── images
│   ├── media
│   ├── network_tester
│   ├── remote_bitrate_estimator
│   ├── rtp_rtcp
│   ├── utility
│   ├── video_coding
│   ├── video_engine
│   └── voice_engine
├── rtc_base # 基础代码,如线程、锁相关的统一接口代码。由于webrtc是夸平台的,所以线程、锁这些会有所不同,特别是在Windows和Linux上使用的函数差别特别大,那怎么办呢?如果上层根据每个平台去做不同的处理的话,就需要些很多代码了。但是分层之后,对于上层逻辑来说,只需要统一调用webrtc定义的这个规范,比如线程规范、锁规范,就可以了,具体在rtc_base这个目录下再区分是Windows层的还是Linux层的还是mac层的等等。
————————————————
版权声明:本文为CSDN博主「费城之鹰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jakezhang1990/article/details/104690208
│   ├── deprecated
│   ├── experiments
│   ├── java
│   ├── memory
│   ├── network
│   ├── numerics
│   ├── strings
│   ├── synchronization
│   ├── system
│   ├── task_utils
│   ├── third_party
│   ├── time
│   ├── units
│   └── win
├── rtc_tools # 里面是一些工具,音视频分析相关的工具代码。比如对H264进行分析的话有I帧、B帧、P帧、NALL头等都可以找到相应的分析工具。(音视频相关的专门的测试工具目录)
│   ├── audioproc_f
│   ├── converter
│   ├── frame_analyzer
│   ├── loopback_test
│   ├── network_tester
│   ├── psnr_ssim_analyzer
│   ├── py_event_log_analyzer
│   ├── rtc_event_log_visualizer
│   ├── rtp_generator
│   ├── testing
│   └── unpack_aecdump
├── sdk # sdk目录:主要存放Android和iOS层代码。如音频视频的采集,渲染等。
│   ├── android
│   └── objc
├── stats #stats目录:存放各种数据统计相关的类。比如,丢包率、抖动时长等等。
│   └── test
├── style-guide
├── system_wrappers #system_wrappers目录:与具体操作系统相关的代码。如CPU特性,原子操作,锁等。各个平台分别形成一个文件,比如Windows的形成一个文件,Linux的形成一个文件等等。
│   ├── include
│   └── source
├── test
│   ├── android
│   ├── fuzzers
│   ├── gl
│   ├── ios
│   ├── linux
│   ├── logging
│   ├── mac
│   ├── network
│   ├── pc
│   ├── peer_scenario
│   ├── scenario
│   ├── testsupport
│   ├── time_controller
│   └── win
├── testing
│   ├── android
│   ├── buildbot
│   ├── chromoting
│   ├── clusterfuzz
│   ├── gmock
│   ├── gtest
│   ├── gtest_ios
│   ├── iossim
│   ├── libfuzzer
│   ├── merge_scripts
│   ├── perf
│   ├── scripts
│   ├── trigger_scripts
│   └── variations
├── third_party
│   ├── Python-Markdown
│   ├── SPIRV-Tools
│   ├── abseil-cpp
│   ├── accessibility-audit
│   ├── accessibility_test_framework
│   ├── adobe
│   ├── afl
│   ├── android_build_tools
│   ├── android_crazy_linker
│   ├── android_data_chart
│   ├── android_deps
│   ├── android_media
│   ├── android_opengl
│   ├── android_platform
│   ├── android_protobuf
│   ├── android_protoc
│   ├── android_provider
│   ├── android_sdk
│   ├── android_support_test_runner
│   ├── android_swipe_refresh
│   ├── android_system_sdk
│   ├── apache-mac
│   ├── apache-portable-runtime
│   ├── apache-win32
│   ├── apple_apsl
│   ├── arcore-android-sdk
│   ├── arcore-android-sdk-client
│   ├── ashmem
│   ├── axe-core
│   ├── bazel
│   ├── blanketjs
│   ├── blink
│   ├── boringssl
│   ├── bouncycastle
│   ├── breakpad
│   ├── brotli
│   ├── bspatch
│   ├── byte_buddy
│   ├── cacheinvalidation
│   ├── catapult
│   ├── ced
│   ├── chaijs
│   ├── checkstyle
│   ├── chromevox
│   ├── cld_3
│   ├── closure_compiler
│   ├── colorama
│   ├── crashpad
│   ├── crc32c
│   ├── d3
│   ├── dav1d
│   ├── decklink
│   ├── depot_tools
│   ├── devscripts
│   ├── dom_distiller_js
│   ├── dpkg-shlibdeps
│   ├── emoji-segmenter
│   ├── espresso
│   ├── expat
│   ├── feed_library
│   ├── ffmpeg
│   ├── flatbuffers
│   ├── fontconfig
│   ├── freetype
│   ├── fuchsia-sdk
│   ├── gif_player
│   ├── glfw
│   ├── glslang
│   ├── google-truth
│   ├── google_android_play_core
│   ├── google_appengine_cloudstorage
│   ├── google_benchmark
│   ├── google_input_tools
│   ├── google_toolbox_for_mac
│   ├── google_trust_services
│   ├── googletest
│   ├── gradle_wrapper
│   ├── grpc
│   ├── gtest-parallel
│   ├── guava
│   ├── gvr-android-keyboard
│   ├── gvr-android-sdk
│   ├── hamcrest
│   ├── harfbuzz-ng
│   ├── hunspell
│   ├── iaccessible2
│   ├── iccjpeg
│   ├── icu
│   ├── icu4j
│   ├── ijar
│   ├── ink
│   ├── inspector_protocol
│   ├── instrumented_libraries
│   ├── isimpledom
│   ├── jacoco
│   ├── javalang
│   ├── jdk
│   ├── jetifier_standalone
│   ├── jinja2
│   ├── jsoncpp
│   ├── jstemplate
│   ├── junit
│   ├── khronos
│   ├── lcov
│   ├── leveldatabase
│   ├── libFuzzer
│   ├── libXNVCtrl
│   ├── libaddressinput
│   ├── libaom
│   ├── libavif
│   ├── libbrlapi
│   ├── libdrm
│   ├── libgav1
│   ├── libipp
│   ├── libjingle_xmpp
│   ├── libjpeg_turbo
│   ├── liblouis
│   ├── libovr
│   ├── libphonenumber
│   ├── libpng
│   ├── libprotobuf-mutator
│   ├── libsecret
│   ├── libsrtp
│   ├── libsync
│   ├── libudev
│   ├── libusb
│   ├── libvpx
│   ├── libwebm
│   ├── libwebp
│   ├── libxml
│   ├── libxslt
│   ├── libyuv
│   ├── llvm-build
│   ├── logilab
│   ├── lottie
│   ├── lzma_sdk
│   ├── mako
│   ├── markdown
│   ├── markupsafe
│   ├── material_design_icons
│   ├── mesa_headers
│   ├── metrics_proto
│   ├── microsoft_webauthn
│   ├── minigbm
│   ├── minizip
│   ├── mocha
│   ├── mockito
│   ├── modp_b64
│   ├── motemplate
│   ├── mozilla
│   ├── nasm
│   ├── netty-tcnative
│   ├── netty4
│   ├── node
│   ├── objenesis
│   ├── ocmock
│   ├── one_euro_filter
│   ├── opencv
│   ├── openh264
│   ├── openscreen
│   ├── openvr
│   ├── openxr
│   ├── opus
│   ├── ots
│   ├── ow2_asm
│   ├── pexpect
│   ├── pffft
│   ├── ply
│   ├── polymer
│   ├── private-join-and-compute
│   ├── private_membership
│   ├── proguard
│   ├── protobuf
│   ├── protoc_javalite
│   ├── pycoverage
│   ├── pyjson5
│   ├── pylint
│   ├── pymock
│   ├── pystache
│   ├── pywebsocket
│   ├── pywebsocket3
│   ├── qcms
│   ├── quic_trace
│   ├── qunit
│   ├── r8
│   ├── re2
│   ├── requests
│   ├── rnnoise
│   ├── robolectric
│   ├── s2cellid
│   ├── schema_org
│   ├── shaderc
│   ├── shell-encryption
│   ├── simplejson
│   ├── sinonjs
│   ├── six
│   ├── smhasher
│   ├── snappy
│   ├── speech-dispatcher
│   ├── spirv-cross
│   ├── spirv-headers
│   ├── sqlite
│   ├── sqlite4java
│   ├── subresource-filter-ruleset
│   ├── sudden_motion_sensor
│   ├── tcmalloc
│   ├── test_fonts
│   ├── tlslite
│   ├── turbine
│   ├── ub-uiautomator
│   ├── unrar
│   ├── usb_ids
│   ├── usrsctp
│   ├── v4l-utils
│   ├── vulkan_headers
│   ├── wayland
│   ├── wayland-protocols
│   ├── wds
│   ├── web-animations-js
│   ├── webdriver
│   ├── webgl
│   ├── webgpu-cts
│   ├── webrtc_overrides
│   ├── webxr_test_pages
│   ├── weston
│   ├── widevine
│   ├── win_build_output
│   ├── woff2
│   ├── wtl
│   ├── wuffs
│   ├── xstream
│   └── zlib
├── tools
│   ├── accessibility
│   ├── android
│   ├── binary_size
│   ├── bisect_repackage
│   ├── cfi
│   ├── check_ecs_deps
│   ├── checkbins
│   ├── checklicenses
│   ├── checkperms
│   ├── checkteamtags
│   ├── chrome_extensions
│   ├── chrome_proxy
│   ├── clang
│   ├── code_coverage
│   ├── compile_test
│   ├── coverity
│   ├── cr
│   ├── cros
│   ├── cygprofile
│   ├── cygprofile_win
│   ├── determinism
│   ├── diagnosis
│   ├── dromaeo_benchmark_runner
│   ├── dump_process_memory
│   ├── emacs
│   ├── find_runtime_symbols
│   ├── flags
│   ├── flakiness
│   ├── fuchsia
│   ├── gdb
│   ├── generate_library_loader
│   ├── generate_shim_headers
│   ├── generate_stubs
│   ├── git
│   ├── gn
│   ├── grit
│   ├── gritsettings
│   ├── idl_parser
│   ├── imagediff
│   ├── infra
│   ├── ipc_fuzzer
│   ├── json_comment_eater
│   ├── json_schema_compiler
│   ├── json_to_struct
│   ├── linux
│   ├── lldb
│   ├── luci-go
│   ├── mac
│   ├── mb
│   ├── md_browser
│   ├── media_engagement_preload
│   ├── memory
│   ├── memory_inspector
│   ├── metrics
│   ├── msan
│   ├── oopif
│   ├── origin_trials
│   ├── page_cycler
│   ├── perf
│   ├── polymer
│   ├── protoc_wrapper
│   ├── python
│   ├── real_world_impact
│   ├── resources
│   ├── security
│   ├── site_compare
│   ├── stats_viewer
│   ├── strict_enum_value_checker
│   ├── style_variable_generator
│   ├── sublime
│   ├── swarming_client
│   ├── symsrc
│   ├── tcmalloc
│   ├── tests
│   ├── traceline
│   ├── traffic_annotation
│   ├── translation
│   ├── ubsan
│   ├── usb_gadget
│   ├── v8_context_snapshot
│   ├── valgrind
│   ├── variations
│   ├── vim
│   ├── vscode
│   ├── web_bluetooth
│   ├── web_dev_style
│   ├── win
│   └── xdisplaycheck
├── tools_webrtc #.tool_webrtc目录:webrtc测试相关的工具代码,各种单元测试如网络模拟器,网络的测试,音频的测试,视频的测试都是在这个目录下。(整个webrtc的测试工具目录)
│   ├── android
│   ├── audio_quality
│   ├── autoroller
│   ├── coverage
│   ├── cpu
│   ├── ios
│   ├── libs
│   ├── matlab
│   ├── mb
│   ├── msan
│   ├── network_emulator
│   ├── perf
│   ├── presubmit_checks_lib
│   ├── sancov
│   ├── sanitizers
│   ├── sslroots
│   ├── ubsan
│   ├── video_quality_toolchain
│   └── vim
└── video #与视频相关的逻辑。当视频编解码处理等相关逻辑
├── adaptation
├── end_to_end_tests
└── test

581 directories

cloud-game

cloud-game/pkg/worker/room/room.go
func NewRoom(roomID string, gameName string, videoEncoderType string, onlineStorage *storage.Client, cfg worker.Config) *Room {
z505/goDLL

go Call c 函数

fan out Ver. 成扇形展开

A wind faned her hair out behand her. 一阵风把她的头发吹的飘散着背后。

1
2

# /Users/choe/go/src/cloud-game/pkg/emulator/libretro/nanoarch/nanoarch.go
image-20200619121245180
coreVideoRefresh // image is resized here and push to channel. On the other side, images will be fan out
WorkerInternal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

$ tree /Users/choe/go/src/cloud-game/pkg/emulator/libretro/
/Users/choe/go/src/cloud-game/pkg/emulator/libretro/
├── image
│   ├── color.go
│   ├── draw.go
│   └── scale.go
└── nanoarch
├── cfuncs.go
├── libretro.h
├── naemulator.go
├── nanoarch.go
└── savestates.go

2 directories, 8 files

~/go/src/cloud-game/pkg/emulator/libretro/image on  master! ⌚ 12:34:29
$ cat draw.go
package image

import (
"image"
)

func DrawRgbaImage(pixFormat int, scaleType int, w int, h int, packedW int, vw int, vh int, bpp int, data []byte, image *image.RGBA) {
switch pixFormat {
case BIT_FORMAT_SHORT_5_6_5:
Resize(scaleType, rgb565, w, h, packedW, vw, vh, bpp, data, image)
case BIT_FORMAT_INT_8_8_8_8_REV:
Resize(scaleType, rgba8888, w, h, packedW, vw, vh, bpp, data, image)
case BIT_FORMAT_SHORT_5_5_5_1:
fallthrough
default:
image = nil
}
}


Resize reference from scale.go

func Resize(scaleType int, fn Format, w int, h int, packedW int, vw int, vh int, bpp int, data []byte, out *image.RGBA) {

// !to implement own image interfaces img.Pix = bytes[]
src := image.NewRGBA(image.Rect(0, 0, w, h))
toRgba(fn, w, h, packedW, bpp, data, src)

// !to do set it once instead switching on each iteration
// !to do skip resize if w=vw h=vh
switch scaleType {
case ScaleSkip:
skip(fn, w, h, packedW, vw, vh, bpp, data, src, out)
case ScaleNearestNeighbour:
draw.NearestNeighbor.Scale(out, out.Bounds(), src, src.Bounds(), draw.Src, nil)
//nearest(fn, w, h, packedW, vw, vh, bpp, data, src, out)
case ScaleBilinear:
draw.ApproxBiLinear.Scale(out, out.Bounds(), src, src.Bounds(), draw.Src, nil)
//bilinear(fn, w, h, packedW, vw, vh, bpp, data, src, out)
case ScaleOld:
fallthrough
default:
old(fn, w, h, packedW, vw, vh, bpp, data, src, out)
}
}
image-20200619145256862
Room 的 startVideo的主流程

Go code that imports a pseudo-package “C” 导入”伪包” “C”,引用C的类型 C.size_t,C的变量C.stdout, C的函数 C.printf