1八、x264編碼在zedboard上的實現(軟編碼)

1、x264開源包獲取html

x264-snapshot提供了開源x264源代碼,已經在X86和ARM架構下均已實現。linux下可使用git得到最新的代碼包linux

git clone git://git.videolan.org/x264.git

也能夠經過網頁下載:git

http://download.videolan.org/pub/videolan/x264/snapshots/架構

2、配置、安裝x264-snapshotapp

下載到源碼後,對其進行配置,以便在後續make時編譯出zed上能夠運行的可執行程序less

一、解壓源碼包後,進入源碼目錄ide

./configure --host=arm-xilinx-linux-gnueabi --prefix=/opt/rcq --enable-shared --disable-asm

congfig以後,設定了host爲arm-xilinx-linux-gnueabi,install路徑是/opt/rcqoop

二、修改config.mak文件測試

針對zed的gcc,須要修改config.mak文件ui

 1 SRCPATH=.  2 prefix=/opt/rcq  3 exec_prefix=${prefix}  4 bindir=${exec_prefix}/bin  5 libdir=${exec_prefix}/lib  6 includedir=${prefix}/include  7 ARCH=ARM  8 SYS=LINUX  9 CC=arm-xilinx-linux-gnueabi-gcc 10 CFLAGS=-Wshadow -O3 -fno-fast-math  -Wall -I. -I$(SRCPATH) -std=gnu99 -fPIC -fomit-frame-pointer -fno-tree-vectorize 11 DEPMM=-MM -g0 12 DEPMT=-MT 13 LD=arm-xilinx-linux-gnueabi-gcc -o 14 LDFLAGS= -lm -lpthread 15 LIBX264=libx264.a 16 AR=arm-xilinx-linux-gnueabi-ar rc 17 RANLIB=arm-xilinx-linux-gnueabi-ranlib 18 STRIP=arm-xilinx-linux-gnueabi-strip 19 AS=
20 ASFLAGS= -DHAVE_ALIGNED_STACK=1 -DPIC -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8
21 RC=
22 RCFLAGS=
23 EXE=
24 HAVE_GETOPT_LONG=1
25 DEVNULL=/dev/null
26 PROF_GEN_CC=-fprofile-generate 27 PROF_GEN_LD=-fprofile-generate 28 PROF_USE_CC=-fprofile-use 29 PROF_USE_LD=-fprofile-use 30 default: cli 31 install: install-cli 32 SOSUFFIX=so 33 SONAME=libx264.so.129
34 SOFLAGS=-shared -Wl,-soname,$(SONAME)  -Wl,-Bsymbolic 35 default: lib-shared 36 install: install-lib-shared 37 LDFLAGSCLI = 
38 CLI_LIBX264 = $(LIBX264)

其中九、1三、1六、1七、18行爲修改後的。

三、make

make install
make

完運行庫的安裝和成執行文件的生成

3、在zed上測試x264

將可執行x264和測試rcq.yuv文件拷貝到zed上,使用默認運行命令

./x264 rcq.yuv --input-res 640x480 -o rcq.flv

其中--input-res 640x480設定輸入yuv視頻幀的大小,rcq.flv是輸出文件,能夠設定爲.mkv/.mp4/H264等。從控制檯能夠看到

使用的profile是最高等級High level 3.0,可是的編碼速率只有1.40fps……情何以堪……

編碼結束後:

生成的rcq.flv文件大小348k,相比較原來的rcq.yuv文件大小33M,壓縮率在1%。

可使用最快編碼方式,命令和參數以下

./x264 rcq.yuv --input-res 640x480 -o rcq.flv --no-8x8dct --aq-mode 0 --b-adapt 0 --bframes 0 --no-cabac --no-deblock --no-mbtree --me dia --no-mixed-refs --partitions none --rc-lookahead 0 --ref 1 --scenecut 0 --subme 0 --trellis 0

編碼速率能有22fps,這樣還湊合。生成的rcq.flv文件大小787K,壓縮率在5%。

4、x264命令和參數(fullhelp)

 1 Syntax: x264 [options] -o outfile infile  2 
 3 Infile can be raw (in which case resolution is required),  4   or YUV4MPEG (*.y4m),  5   or Avisynth if compiled with support (no).  6   or libav* formats if compiled with lavf support (no) or ffms support (no).  7 Outfile type is selected by filename:  8  .264 -> Raw bytestream  9  .mkv -> Matroska  10  .flv -> Flash Video  11  .mp4 -> MP4 if compiled with GPAC support (no)  12 Output bit depth: 8 (configured at compile time)  13 
 14 Options:  15 
 16   -h, --help List basic options  17       --longhelp List more options  18       --fullhelp List all options  19 
 20 Example usage:  21 
 22  Constant quality mode:  23             x264 --crf 24 -o <output> <input>
 24 
 25       Two-pass with a bitrate of 1000kbps:  26             x264 --pass 1 --bitrate 1000 -o <output> <input>
 27             x264 --pass 2 --bitrate 1000 -o <output> <input>
 28 
 29  Lossless:  30             x264 --qp 0 -o <output> <input>
 31 
 32  Maximum PSNR at the cost of speed and visual quality:  33             x264 --preset placebo --tune psnr -o <output> <input>
 34 
 35       Constant bitrate at 1000kbps with a 2 second-buffer:  36             x264 --vbv-bufsize 2000 --bitrate 1000 -o <output> <input>
 37 
 38 Presets:  39 
 40       --profile <string>      Force the limits of an H.264 profile  41  Overrides all settings.  42                                   - baseline:  43                                     --no-8x8dct --bframes 0 --no-cabac  44                                     --cqm flat --weightp 0
 45  No interlaced.  46  No lossless.  47                                   - main:  48                                     --no-8x8dct --cqm flat  49  No lossless.  50                                   - high:  51  No lossless.  52                                   - high10:  53  No lossless.  54                                     Support for bit depth 8-10.  55                                   - high422:  56  No lossless.  57                                     Support for bit depth 8-10.  58                                     Support for 4:2:0/4:2:2 chroma subsampling.  59                                   - high444:  60                                     Support for bit depth 8-10.  61                                     Support for 4:2:0/4:2:2/4:4:4 chroma subsampling.  62       --preset <string>       Use a preset to select encoding settings [medium]  63  Overridden by user settings.  64                                   - ultrafast:  65                                     --no-8x8dct --aq-mode 0 --b-adapt 0
 66                                     --bframes 0 --no-cabac --no-deblock  67                                     --no-mbtree --me dia --no-mixed-refs  68                                     --partitions none --rc-lookahead 0 --ref 1
 69                                     --scenecut 0 --subme 0 --trellis 0
 70                                     --no-weightb --weightp 0
 71                                   - superfast:  72                                     --no-mbtree --me dia --no-mixed-refs  73                                     --partitions i8x8,i4x4 --rc-lookahead 0
 74                                     --ref 1 --subme 1 --trellis 0 --weightp 1
 75                                   - veryfast:  76                                     --no-mixed-refs --rc-lookahead 10
 77                                     --ref 1 --subme 2 --trellis 0 --weightp 1
 78                                   - faster:  79                                     --no-mixed-refs --rc-lookahead 20
 80                                     --ref 2 --subme 4 --weightp 1
 81                                   - fast:  82                                     --rc-lookahead 30 --ref 2 --subme 6
 83                                     --weightp 1
 84                                   - medium:  85  Default settings apply.  86                                   - slow:  87                                     --b-adapt 2 --direct auto --me umh  88                                     --rc-lookahead 50 --ref 5 --subme 8
 89                                   - slower:  90                                     --b-adapt 2 --direct auto --me umh  91                                     --partitions all --rc-lookahead 60
 92                                     --ref 8 --subme 9 --trellis 2
 93                                   - veryslow:  94                                     --b-adapt 2 --bframes 8 --direct auto  95                                     --me umh --merange 24 --partitions all  96                                     --ref 16 --subme 10 --trellis 2
 97                                     --rc-lookahead 60
 98                                   - placebo:  99                                     --bframes 16 --b-adapt 2 --direct auto 100                                     --slow-firstpass --no-fast-pskip 101                                     --me tesa --merange 24 --partitions all 102                                     --rc-lookahead 60 --ref 16 --subme 11
103                                     --trellis 2
104       --tune <string>         Tune the settings for a particular type of source 105  or situation 106  Overridden by user settings. 107  Multiple tunings are separated by commas. 108  Only one psy tuning can be used at a time. 109                                   - film (psy tuning): 110                                     --deblock -1:-1 --psy-rd <unset>:0.15
111                                   - animation (psy tuning): 112                                     --bframes {+2} --deblock 1:1
113                                     --psy-rd 0.4:<unset> --aq-strength 0.6
114                                     --ref {Double if >1 else 1} 115                                   - grain (psy tuning): 116                                     --aq-strength 0.5 --no-dct-decimate 117                                     --deadzone-inter 6 --deadzone-intra 6
118                                     --deblock -2:-2 --ipratio 1.1 
119                                     --pbratio 1.1 --psy-rd <unset>:0.25
120                                     --qcomp 0.8
121                                   - stillimage (psy tuning): 122                                     --aq-strength 1.2 --deblock -3:-3
123                                     --psy-rd 2.0:0.7
124                                   - psnr (psy tuning): 125                                     --aq-mode 0 --no-psy 126                                   - ssim (psy tuning): 127                                     --aq-mode 2 --no-psy 128 \                                  - fastdecode: 129                                     --no-cabac --no-deblock --no-weightb 130                                     --weightp 0
131                                   - zerolatency: 132                                     --bframes 0 --force-cfr --no-mbtree 133                                     --sync-lookahead 0 --sliced-threads 134                                     --rc-lookahead 0
135       --slow-firstpass        Don't force these faster settings with --pass 1:
136                                   --no-8x8dct --me dia --partitions none 137                                   --ref 1 --subme {2 if >2 else unchanged} 138                                   --trellis 0 --fast-pskip 139 
140 Frame-type options: 141 
142   -I, --keyint <integer or "infinite"> Maximum GOP size [250] 143   -i, --min-keyint <integer> Minimum GOP size [auto] 144       --no-scenecut           Disable adaptive I-frame decision 145       --scenecut <integer>    How aggressively to insert extra I-frames [40] 146       --intra-refresh Use Periodic Intra Refresh instead of IDR frames 147   -b, --bframes <integer>     Number of B-frames between I and P [3] 148       --b-adapt <integer>     Adaptive B-frame decision method [1] 149  Higher values may lower threading efficiency. 150                                   - 0: Disabled 151                                   - 1: Fast 152                                   - 2: Optimal (slow with high --bframes) 153       --b-bias <integer>      Influences how often B-frames are used [0] 154       --b-pyramid <string>    Keep some B-frames as references [normal] 155                                   - none: Disabled 156                                   - strict: Strictly hierarchical pyramid 157                                   - normal: Non-strict (not Blu-ray compatible) 158       --open-gop Use recovery points to close GOPs 159                               Only available with b-frames 160       --no-cabac Disable CABAC 161   -r, --ref <integer>         Number of reference frames [3] 162       --no-deblock Disable loop filter 163   -f, --deblock <alpha:beta>  Loop filter parameters [0:0] 164       --slices <integer> Number of slices per frame; forces rectangular 165                               slices and is overridden by other slicing options 166       --slice-max-size <integer> Limit the size of each slice in bytes 167       --slice-max-mbs <integer> Limit the size of each slice in macroblocks 168       --tff Enable interlaced mode (top field first) 169       --bff Enable interlaced mode (bottom field first) 170       --constrained-intra Enable constrained intra prediction. 171       --pulldown <string> Use soft pulldown to change frame rate 172                                   - none, 22, 32, 64, double, triple, euro (requires cfr input) 173       --fake-interlaced       Flag stream as interlaced but encode progressive. 174                               Makes it possible to encode 25p and 30p Blu-Ray 175                               streams. Ignored in interlaced mode. 176       --frame-packing <integer> For stereoscopic videos define frame arrangement 177                                   - 0: checkerboard - pixels are alternatively from L and R 178                                   - 1: column alternation - L and R are interlaced by column 179                                   - 2: row alternation - L and R are interlaced by row 180                                   - 3: side by side - L is on the left, R on the right 181                                   - 4: top bottom - L is on top, R on bottom 182                                   - 5: frame alternation - one view per frame 183 
184 Ratecontrol: 185 
186   -q, --qp <integer>          Force constant QP (0-69, 0=lossless) 187   -B, --bitrate <integer>     Set bitrate (kbit/s) 188       --crf <float>           Quality-based VBR (0-51) [23.0] 189       --rc-lookahead <integer> Number of frames for frametype lookahead [40] 190       --vbv-maxrate <integer> Max local bitrate (kbit/s) [0] 191       --vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0] 192       --vbv-init <float>      Initial VBV buffer occupancy [0.9] 193       --crf-max <float>       With CRF+VBV, limit RF to this value 194                                   May cause VBV underflows!
195       --qpmin <integer>       Set min QP [0] 196       --qpmax <integer>       Set max QP [69] 197       --qpstep <integer>      Set max QP step [4] 198       --ratetol <float>       Tolerance of ABR ratecontrol and VBV [1.0] 199       --ipratio <float>       QP factor between I and P [1.40] 200       --pbratio <float>       QP factor between P and B [1.30] 201       --chroma-qp-offset <integer>  QP difference between chroma and luma [0] 202       --aq-mode <integer>     AQ method [1] 203                                   - 0: Disabled 204                                   - 1: Variance AQ (complexity mask) 205                                   - 2: Auto-variance AQ (experimental) 206       --aq-strength <float>   Reduces blocking and blurring in flat and 207                               textured areas. [1.0] 208 
209   -p, --pass <integer> Enable multipass ratecontrol 210                                   - 1: First pass, creates stats file 211                                   - 2: Last pass, does not overwrite stats file 212                                   - 3: Nth pass, overwrites stats file 213       --stats <string>        Filename for 2 pass stats ["x264_2pass.log"] 214       --no-mbtree             Disable mb-tree ratecontrol. 215       --qcomp <float>         QP curve compression [0.60] 216       --cplxblur <float>      Reduce fluctuations in QP (before curve compression) [20.0] 217       --qblur <float>         Reduce fluctuations in QP (after curve compression) [0.5] 218       --zones <zone0>/<zone1>/... Tweak the bitrate of regions of the video 219                               Each zone is of the form 220                                   <start frame>,<end frame>,<option>
221                                   where <option> is either 222                                       q=<integer> (force QP) 223                                   or  b=<float> (bitrate multiplier) 224       --qpfile <string>       Force frametypes and QPs for some or all frames 225  Format of each line: framenumber frametype QP 226                               QP is optional (none lets x264 choose). Frametypes: I,i,K,P,B,b. 227                                   K=<I or i> depending on open-gop setting 228                               QPs are restricted by qpmin/qpmax. 229 
230 Analysis: 231 
232   -A, --partitions <string>   Partitions to consider ["p8x8,b8x8,i8x8,i4x4"] 233                                   - p8x8, p4x4, b8x8, i8x8, i4x4 234                                   - none, all 235                                   (p4x4 requires p8x8. i8x8 requires --8x8dct.) 236       --direct <string>       Direct MV prediction mode ["spatial"] 237                                   - none, spatial, temporal, auto 238       --no-weightb            Disable weighted prediction for B-frames 239       --weightp <integer>     Weighted prediction for P-frames [2] 240                                   - 0: Disabled 241                                   - 1: Weighted refs 242                                   - 2: Weighted refs + Duplicates 243       --me <string>           Integer pixel motion estimation method ["hex"] 244                                   - dia: diamond search, radius 1 (fast) 245                                   - hex: hexagonal search, radius 2
246                                   - umh: uneven multi-hexagon search 247                                   - esa: exhaustive search 248                                   - tesa: hadamard exhaustive search (slow) 249       --merange <integer>     Maximum motion vector search range [16] 250       --mvrange <integer>     Maximum motion vector length [-1 (auto)] 251       --mvrange-thread <int>  Minimum buffer between threads [-1 (auto)] 252   -m, --subme <integer>       Subpixel motion estimation and mode decision [7] 253                                   - 0: fullpel only (not recommended) 254                                   - 1: SAD mode decision, one qpel iteration 255                                   - 2: SATD mode decision 256                                   - 3-5: Progressively more qpel 257                                   - 6: RD mode decision for I/P-frames 258                                   - 7: RD mode decision for all frames 259                                   - 8: RD refinement for I/P-frames 260                                   - 9: RD refinement for all frames 261                                   - 10: QP-RD - requires trellis=2, aq-mode>0
262                                   - 11: Full RD: disable all early terminations 263       --psy-rd <float:float>  Strength of psychovisual optimization ["1.0:0.0"] 264                                   #1: RD (requires subme>=6) 265                                   #2: Trellis (requires trellis, experimental) 266       --no-psy Disable all visual optimizations that worsen 267  both PSNR and SSIM. 268       --no-mixed-refs         Don't decide references on a per partition basis
269       --no-chroma-me          Ignore chroma in motion estimation 270       --no-8x8dct Disable adaptive spatial transform size 271   -t, --trellis <integer>     Trellis RD quantization. [1] 272                                   - 0: disabled 273                                   - 1: enabled only on the final encode of a MB 274                                   - 2: enabled on all mode decisions 275       --no-fast-pskip         Disables early SKIP detection on P-frames 276       --no-dct-decimate       Disables coefficient thresholding on P-frames 277       --nr <integer>          Noise reduction [0] 278 
279       --deadzone-inter <int>  Set the size of the inter luma quantization deadzone [21] 280       --deadzone-intra <int>  Set the size of the intra luma quantization deadzone [11] 281                                   Deadzones should be in the range 0 - 32. 282       --cqm <string>          Preset quant matrices ["flat"] 283                                   - jvt, flat 284       --cqmfile <string>      Read custom quant matrices from a JM-compatible file 285                                   Overrides any other --cqm* options. 286       --cqm4 <list> Set all 4x4 quant matrices 287                                   Takes a comma-separated list of 16 integers. 288       --cqm8 <list> Set all 8x8 quant matrices 289                                   Takes a comma-separated list of 64 integers. 290       --cqm4i, --cqm4p, --cqm8i, --cqm8p <list>
291  Set both luma and chroma quant matrices 292       --cqm4iy, --cqm4ic, --cqm4py, --cqm4pc <list>
293  Set individual quant matrices 294 
295 Video Usability Info (Annex E): 296 The VUI settings are not used by the encoder but are merely suggestions to 297 the playback equipment. See doc/vui.txt for details. Use at your own risk. 298 
299       --overscan <string>     Specify crop overscan setting ["undef"] 300                                   - undef, show, crop 301       --videoformat <string>  Specify video format ["undef"] 302                                   - component, pal, ntsc, secam, mac, undef 303       --range <string>        Specify color range ["auto"] 304                                   - auto, tv, pc 305       --colorprim <string>    Specify color primaries ["undef"] 306                                   - undef, bt709, bt470m, bt470bg 307  smpte170m, smpte240m, film 308       --transfer <string>     Specify transfer characteristics ["undef"] 309                                   - undef, bt709, bt470m, bt470bg, linear, 310  log100, log316, smpte170m, smpte240m 311       --colormatrix <string>  Specify color matrix setting ["???"] 312                                   - undef, bt709, fcc, bt470bg 313  smpte170m, smpte240m, GBR, YCgCo 314       --chromaloc <integer>   Specify chroma sample location (0 to 5) [0] 315       --nal-hrd <string>      Signal HRD information (requires vbv-bufsize) 316                                   - none, vbr, cbr (cbr not allowed in .mp4) 317       --pic-struct            Force pic_struct in Picture Timing SEI 318       --crop-rect <string>    Add 'left,top,right,bottom' to the bitstream-level 319  cropping rectangle 320 
321 Input/Output: 322 
323   -o, --output <string> Specify output file 324       --muxer <string>        Specify output container format ["auto"] 325                                   - auto, raw, mkv, flv 326       --demuxer <string>      Specify input container format ["auto"] 327                                   - auto, raw, y4m 328       --input-fmt <string> Specify input file format (requires lavf support) 329       --input-csp <string>    Specify input colorspace format for raw input 330                               - valid csps for `raw' demuxer:
331  i420, yv12, nv12, i422, yv16, nv16, i444, yv24, bgr, bgra, rgb 332       --output-csp <string>   Specify output colorspace ["i420"] 333                                   - i420, i422, i444, rgb 334       --input-depth <integer> Specify input bit depth for raw input 335       --input-range <string>  Specify input color range ["auto"] 336                                   - auto, tv, pc 337       --input-res <intxint> Specify input resolution (width x height) 338       --index <string>        Filename for input index file 339       --sar width:height Specify Sample Aspect Ratio 340       --fps <float|rational> Specify framerate 341       --seek <integer> First frame to encode 342       --frames <integer> Maximum number of frames to encode 343       --level <string>        Specify level (as defined by Annex A) 344       --bluray-compat         Enable compatibility hacks for Blu-ray support 345 
346   -v, --verbose               Print stats for each frame 347       --no-progress           Don't show the progress indicator while encoding
348       --quiet Quiet Mode 349       --log-level <string>    Specify the maximum level of logging ["info"] 350                                   - none, error, warning, info, debug 351       --psnr Enable PSNR computation 352       --ssim Enable SSIM computation 353       --threads <integer> Force a specific number of threads 354       --lookahead-threads <integer> Force a specific number of lookahead threads 355       --sliced-threads        Low-latency but lower-efficiency threading 356       --thread-input          Run Avisynth in its own thread 357       --sync-lookahead <integer> Number of buffer frames for threaded lookahead 358       --non-deterministic Slightly improve quality of SMP, at the cost of repeatability 359       --cpu-independent Ensure exact reproducibility across different cpus, 360                                   as opposed to letting them select different algorithms 361       --asm <integer> Override CPU detection 362       --no-asm Disable all CPU optimizations 363       --visualize Show MB types overlayed on the encoded video 364       --dump-yuv <string> Save reconstructed frames 365       --sps-id <integer>      Set SPS and PPS id numbers [0] 366       --aud Use access unit delimiters 367       --force-cfr Force constant framerate timestamp generation 368       --tcfile-in <string> Force timestamp generation with timecode file 369       --tcfile-out <string>   Output timecode v2 file from input timestamps 370       --timebase <int/int> Specify timebase numerator and denominator 371                  <integer>    Specify timebase numerator for input timecode file 372                               or specify timebase denominator for other input 373       --dts-compress Eliminate initial delay with container DTS hack 374 
375 Filtering: 376 
377       --vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file 378 
379       Filter options may be specified in <filter>:<option>=<value> format. 380 
381  Available filters: 382  crop:left,top,right,bottom 383             removes pixels from the edges of the frame 384  select_every:step,offset1[,...] 385  apply a selection pattern to input frames 386             step: the number of frames in the pattern 387             offsets: the offset into the step to select a frame 388             see: http://avisynth.org/mediawiki/Select#SelectEvery

5、關於YUV420的格式說明

YUV格式有兩大類:planar和packed。
對於planar的YUV格式,先連續存儲全部像素點的Y,緊接着存儲全部像素點的U,隨後是全部像素點的V。
對於packed的YUV格式,每一個像素點的Y,U,V是連續交*存儲的。

通常的錄像程序是先從攝像頭獲得yuv420 planar的數據,而後編碼成h264格式 幀,最後存儲成3gp/mpeg等格式的視頻文件。

以720×488大小圖象YUV420 planar爲例,其存儲格式是:
共大小爲(720×480×3>>1)字節,分爲三個部分:Y,U和V
Y份量: (720×480)個字節
U(Cb)份量:(720×480>>2)個字節
V(Cr)份量:(720×480>>2)個字節
三個部份內部均是行優先存儲,三個部分之間是Y,U,V 順序存儲。
即YUV數據的0--720×480字節是Y份量值,
720×480--720×480×5/4字節是U份量
720×480×5/4 --720×480×3/2字節是V份量。

一副w*h的yuv420圖像數據的大小爲w*h*1.5。
:2: 2 和4:2:0 轉換:

最簡單的方式:
YUV4:2:2 ---> YUV4:2:0 Y不變,將U和V信號值在行(垂直方向)在進行一次隔行抽樣。
YUV4:2:0 ---> YUV4:2:2 Y不變,將U和V信號值的每一行分別拷貝一份造成連續兩行數據。

 

6、測試視頻

 

0、x264-snapshots:http://download.videolan.org/pub/videolan/x264/snapshots/

一、zed可執行文件:https://files.cnblogs.com/files/liusiluandzhangkun/x264.rar

二、測試yuv文件:https://files.cnblogs.com/files/liusiluandzhangkun/rcq.part1.rar   https://files.cnblogs.com/files/liusiluandzhangkun/rcq.part2.rar

三、其餘通用測試yuv序列:http://www.cipr.rpi.edu/resource/sequences/sif.html

相關文章
相關標籤/搜索