History

avfilter/drawutils: >8 bit support

Paul B Mahol committed 10 years ago

Commit 38ed5281 parent 6b706ce3 files · +239 −43Browse files

Unified · Split

3 files
  1. libavfilter/drawutils.c +204 −40
  2. libavfilter/drawutils.h +3 −3
  3. tests/ref/fate/filter-pixfmts-pad +32 −0
libavfilter/drawutils.c+204−40
@@ -24,6 +24,7 @@ · 23 unmodified lines
24#include "libavutil/avassert.h"24#include "libavutil/avassert.h"
25#include "libavutil/avutil.h"25#include "libavutil/avutil.h"
26#include "libavutil/colorspace.h"26#include "libavutil/colorspace.h"
27#include "libavutil/intreadwrite.h"
27#include "libavutil/mem.h"28#include "libavutil/mem.h"
28#include "libavutil/pixdesc.h"29#include "libavutil/pixdesc.h"
29#include "drawutils.h"30#include "drawutils.h"
@@ -175,8 +176,10 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) · 145 unmodified lines
175 return AVERROR(ENOSYS);176 return AVERROR(ENOSYS);
176 for (i = 0; i < desc->nb_components; i++) {177 for (i = 0; i < desc->nb_components; i++) {
177 c = &desc->comp[i];178 c = &desc->comp[i];
178 /* for now, only 8-bits formats */179 /* for now, only 8-16 bits formats */
179 if (c->depth != 8)180 if (c->depth < 8 || c->depth > 16)
181 return AVERROR(ENOSYS);
182 if (desc->flags & AV_PIX_FMT_FLAG_BE)
180 return AVERROR(ENOSYS);183 return AVERROR(ENOSYS);
181 if (c->plane >= MAX_PLANES)184 if (c->plane >= MAX_PLANES)
182 return AVERROR(ENOSYS);185 return AVERROR(ENOSYS);
@@ -184,6 +187,9 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) · 1 unmodified line
184 if (pixelstep[c->plane] != 0 &&187 if (pixelstep[c->plane] != 0 &&
185 pixelstep[c->plane] != c->step)188 pixelstep[c->plane] != c->step)
186 return AVERROR(ENOSYS);189 return AVERROR(ENOSYS);
190 if (pixelstep[c->plane] == 6 &&
191 c->depth == 16)
192 return AVERROR(ENOSYS);
187 pixelstep[c->plane] = c->step;193 pixelstep[c->plane] = c->step;
188 if (pixelstep[c->plane] >= 8)194 if (pixelstep[c->plane] >= 8)
189 return AVERROR(ENOSYS);195 return AVERROR(ENOSYS);
@@ -214,11 +220,18 @@ void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4 · 24 unmodified lines
214 if ((draw->desc->flags & AV_PIX_FMT_FLAG_RGB) &&220 if ((draw->desc->flags & AV_PIX_FMT_FLAG_RGB) &&
215 ff_fill_rgba_map(rgba_map, draw->format) >= 0) {221 ff_fill_rgba_map(rgba_map, draw->format) >= 0) {
216 if (draw->nb_planes == 1) {222 if (draw->nb_planes == 1) {
217 for (i = 0; i < 4; i++)223 for (i = 0; i < 4; i++) {
218 color->comp[0].u8[rgba_map[i]] = rgba[i];224 color->comp[0].u8[rgba_map[i]] = rgba[i];
225 if (draw->desc->comp[rgba_map[i]].depth > 8) {
226 color->comp[0].u16[rgba_map[i]] = color->comp[0].u8[rgba_map[i]] << 8;
227 }
228 }
219 } else {229 } else {
220 for (i = 0; i < 4; i++)230 for (i = 0; i < 4; i++) {
221 color->comp[rgba_map[i]].u8[0] = rgba[i];231 color->comp[rgba_map[i]].u8[0] = rgba[i];
232 if (draw->desc->comp[rgba_map[i]].depth > 8)
233 color->comp[rgba_map[i]].u16[0] = color->comp[rgba_map[i]].u8[0] << (draw->desc->comp[rgba_map[i]].depth - 8);
234 }
222 }235 }
223 } else if (draw->nb_planes == 3 || draw->nb_planes == 4) {236 } else if (draw->nb_planes == 3 || draw->nb_planes == 4) {
224 /* assume YUV */237 /* assume YUV */
@@ -226,9 +239,22 @@ void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4 · 1 unmodified line
226 color->comp[1].u8[0] = RGB_TO_U_CCIR(rgba[0], rgba[1], rgba[2], 0);239 color->comp[1].u8[0] = RGB_TO_U_CCIR(rgba[0], rgba[1], rgba[2], 0);
227 color->comp[2].u8[0] = RGB_TO_V_CCIR(rgba[0], rgba[1], rgba[2], 0);240 color->comp[2].u8[0] = RGB_TO_V_CCIR(rgba[0], rgba[1], rgba[2], 0);
228 color->comp[3].u8[0] = rgba[3];241 color->comp[3].u8[0] = rgba[3];
242 if (draw->desc->comp[0].depth > 8)
243 color->comp[0].u16[0] = color->comp[0].u8[0] << (draw->desc->comp[0].depth - 8);
244 if (draw->desc->comp[1].depth > 8)
245 color->comp[1].u16[0] = color->comp[1].u8[0] << (draw->desc->comp[1].depth - 8);
246 if (draw->desc->comp[2].depth > 8)
247 color->comp[2].u16[0] = color->comp[2].u8[0] << (draw->desc->comp[2].depth - 8);
248 if (draw->desc->comp[3].depth > 8)
249 color->comp[3].u16[0] = color->comp[3].u8[0] << (draw->desc->comp[3].depth - 8);
229 } else if (draw->format == AV_PIX_FMT_GRAY8 || draw->format == AV_PIX_FMT_GRAY8A) {250 } else if (draw->format == AV_PIX_FMT_GRAY8 || draw->format == AV_PIX_FMT_GRAY8A) {
230 color->comp[0].u8[0] = RGB_TO_Y_CCIR(rgba[0], rgba[1], rgba[2]);251 color->comp[0].u8[0] = RGB_TO_Y_CCIR(rgba[0], rgba[1], rgba[2]);
231 color->comp[1].u8[0] = rgba[3];252 color->comp[1].u8[0] = rgba[3];
253 } else if (draw->format == AV_PIX_FMT_GRAY16 || draw->format == AV_PIX_FMT_YA16) {
254 color->comp[0].u8[0] = RGB_TO_Y_CCIR(rgba[0], rgba[1], rgba[2]);
255 color->comp[0].u16[0] = color->comp[0].u8[0] << 8;
256 color->comp[1].u8[0] = rgba[3];
257 color->comp[1].u16[0] = color->comp[1].u8[0] << 8;
232 } else {258 } else {
233 av_log(NULL, AV_LOG_WARNING,259 av_log(NULL, AV_LOG_WARNING,
234 "Color conversion not implemented for %s\n", draw->desc->name);260 "Color conversion not implemented for %s\n", draw->desc->name);
@@ -361,6 +387,31 @@ static void blend_line(uint8_t *dst, unsigned src, unsigned alpha, · 126 unmodified lines
361 }387 }
362}388}
363 389
390static void blend_line16(uint8_t *dst, unsigned src, unsigned alpha,
391 int dx, int w, unsigned hsub, int left, int right)
392{
393 unsigned asrc = alpha * src;
394 unsigned tau = 0x10001 - alpha;
395 int x;
396
397 if (left) {
398 unsigned suba = (left * alpha) >> hsub;
399 uint16_t value = AV_RL16(dst);
400 AV_WL16(dst, (value * (0x10001 - suba) + src * suba) >> 16);
401 dst += dx;
402 }
403 for (x = 0; x < w; x++) {
404 uint16_t value = AV_RL16(dst);
405 AV_WL16(dst, (value * tau + asrc) >> 16);
406 dst += dx;
407 }
408 if (right) {
409 unsigned suba = (right * alpha) >> hsub;
410 uint16_t value = AV_RL16(dst);
411 AV_WL16(dst, (value * (0x10001 - suba) + src * suba) >> 16);
412 }
413}
414
364void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color,415void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color,
365 uint8_t *dst[], int dst_linesize[],416 uint8_t *dst[], int dst_linesize[],
366 int dst_w, int dst_h,417 int dst_w, int dst_h,
@@ -375,8 +426,13 @@ void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color, · 8 unmodified lines
375 clip_interval(dst_h, &y0, &h, NULL);426 clip_interval(dst_h, &y0, &h, NULL);
376 if (w <= 0 || h <= 0 || !color->rgba[3])427 if (w <= 0 || h <= 0 || !color->rgba[3])
377 return;428 return;
378 /* 0x10203 * alpha + 2 is in the [ 2 ; 0x1010101 - 2 ] range */429 if (draw->desc->comp[0].depth <= 8) {
379 alpha = 0x10203 * color->rgba[3] + 0x2;430 /* 0x10203 * alpha + 2 is in the [ 2 ; 0x1010101 - 2 ] range */
431 alpha = 0x10203 * color->rgba[3] + 0x2;
432 } else {
433 /* 0x101 * alpha is in the [ 2 ; 0x1001] range */
434 alpha = 0x101 * color->rgba[3] + 0x2;
435 }
380 nb_planes = (draw->nb_planes - 1) | 1; /* eliminate alpha */436 nb_planes = (draw->nb_planes - 1) | 1; /* eliminate alpha */
381 for (plane = 0; plane < nb_planes; plane++) {437 for (plane = 0; plane < nb_planes; plane++) {
382 nb_comp = draw->pixelstep[plane];438 nb_comp = draw->pixelstep[plane];
@@ -388,29 +444,77 @@ void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color, · 5 unmodified lines
388 subsampling_bounds(draw->hsub[plane], &x_sub, &w_sub, &left, &right);444 subsampling_bounds(draw->hsub[plane], &x_sub, &w_sub, &left, &right);
389 subsampling_bounds(draw->vsub[plane], &y_sub, &h_sub, &top, &bottom);445 subsampling_bounds(draw->vsub[plane], &y_sub, &h_sub, &top, &bottom);
390 for (comp = 0; comp < nb_comp; comp++) {446 for (comp = 0; comp < nb_comp; comp++) {
447 const int depth = draw->desc->comp[comp].depth;
448
391 if (!component_used(draw, plane, comp))449 if (!component_used(draw, plane, comp))
392 continue;450 continue;
393 p = p0 + comp;451 p = p0 + comp;
394 if (top) {452 if (top) {
395 blend_line(p, color->comp[plane].u8[comp], alpha >> 1,453 if (depth <= 8) {
396 draw->pixelstep[plane], w_sub,454 blend_line(p, color->comp[plane].u8[comp], alpha >> 1,
397 draw->hsub[plane], left, right);455 draw->pixelstep[plane], w_sub,
456 draw->hsub[plane], left, right);
457 } else {
458 blend_line16(p, color->comp[plane].u16[comp], alpha >> 1,
459 draw->pixelstep[plane], w_sub,
460 draw->hsub[plane], left, right);
461 }
398 p += dst_linesize[plane];462 p += dst_linesize[plane];
399 }463 }
400 for (y = 0; y < h_sub; y++) {464 if (depth <= 8) {
401 blend_line(p, color->comp[plane].u8[comp], alpha,465 for (y = 0; y < h_sub; y++) {
402 draw->pixelstep[plane], w_sub,466 blend_line(p, color->comp[plane].u8[comp], alpha,
403 draw->hsub[plane], left, right);467 draw->pixelstep[plane], w_sub,
404 p += dst_linesize[plane];468 draw->hsub[plane], left, right);
469 p += dst_linesize[plane];
470 }
471 } else {
472 for (y = 0; y < h_sub; y++) {
473 blend_line16(p, color->comp[plane].u16[comp], alpha,
474 draw->pixelstep[plane], w_sub,
475 draw->hsub[plane], left, right);
476 p += dst_linesize[plane];
477 }
478 }
479 if (bottom) {
480 if (depth <= 8) {
481 blend_line(p, color->comp[plane].u8[comp], alpha >> 1,
482 draw->pixelstep[plane], w_sub,
483 draw->hsub[plane], left, right);
484 } else {
485 blend_line16(p, color->comp[plane].u16[comp], alpha >> 1,
486 draw->pixelstep[plane], w_sub,
487 draw->hsub[plane], left, right);
488 }
405 }489 }
406 if (bottom)
407 blend_line(p, color->comp[plane].u8[comp], alpha >> 1,
408 draw->pixelstep[plane], w_sub,
409 draw->hsub[plane], left, right);
410 }490 }
411 }491 }
412}492}
413 493
494static void blend_pixel16(uint8_t *dst, unsigned src, unsigned alpha,
495 const uint8_t *mask, int mask_linesize, int l2depth,
496 unsigned w, unsigned h, unsigned shift, unsigned xm0)
497{
498 unsigned xm, x, y, t = 0;
499 unsigned xmshf = 3 - l2depth;
500 unsigned xmmod = 7 >> l2depth;
501 unsigned mbits = (1 << (1 << l2depth)) - 1;
502 unsigned mmult = 255 / mbits;
503 uint16_t value = AV_RL16(dst);
504
505 for (y = 0; y < h; y++) {
506 xm = xm0;
507 for (x = 0; x < w; x++) {
508 t += ((mask[xm >> xmshf] >> ((~xm & xmmod) << l2depth)) & mbits)
509 * mmult;
510 xm++;
511 }
512 mask += mask_linesize;
513 }
514 alpha = (t >> shift) * alpha;
515 AV_WL16(dst, ((0x10001 - alpha) * value + alpha * src) >> 16);
516}
517
414static void blend_pixel(uint8_t *dst, unsigned src, unsigned alpha,518static void blend_pixel(uint8_t *dst, unsigned src, unsigned alpha,
415 const uint8_t *mask, int mask_linesize, int l2depth,519 const uint8_t *mask, int mask_linesize, int l2depth,
416 unsigned w, unsigned h, unsigned shift, unsigned xm0)520 unsigned w, unsigned h, unsigned shift, unsigned xm0)
@@ -434,6 +538,31 @@ static void blend_pixel(uint8_t *dst, unsigned src, unsigned alpha, · 17 unmodified lines
434 *dst = ((0x1010101 - alpha) * *dst + alpha * src) >> 24;538 *dst = ((0x1010101 - alpha) * *dst + alpha * src) >> 24;
435}539}
436 540
541static void blend_line_hv16(uint8_t *dst, int dst_delta,
542 unsigned src, unsigned alpha,
543 const uint8_t *mask, int mask_linesize, int l2depth, int w,
544 unsigned hsub, unsigned vsub,
545 int xm, int left, int right, int hband)
546{
547 int x;
548
549 if (left) {
550 blend_pixel16(dst, src, alpha, mask, mask_linesize, l2depth,
551 left, hband, hsub + vsub, xm);
552 dst += dst_delta;
553 xm += left;
554 }
555 for (x = 0; x < w; x++) {
556 blend_pixel16(dst, src, alpha, mask, mask_linesize, l2depth,
557 1 << hsub, hband, hsub + vsub, xm);
558 dst += dst_delta;
559 xm += 1 << hsub;
560 }
561 if (right)
562 blend_pixel16(dst, src, alpha, mask, mask_linesize, l2depth,
563 right, hband, hsub + vsub, xm);
564}
565
437static void blend_line_hv(uint8_t *dst, int dst_delta,566static void blend_line_hv(uint8_t *dst, int dst_delta,
438 unsigned src, unsigned alpha,567 unsigned src, unsigned alpha,
439 const uint8_t *mask, int mask_linesize, int l2depth, int w,568 const uint8_t *mask, int mask_linesize, int l2depth, int w,
@@ -474,9 +603,13 @@ void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color, · 34 unmodified lines
474 mask += ym0 * mask_linesize;603 mask += ym0 * mask_linesize;
475 if (mask_w <= 0 || mask_h <= 0 || !color->rgba[3])604 if (mask_w <= 0 || mask_h <= 0 || !color->rgba[3])
476 return;605 return;
477 /* alpha is in the [ 0 ; 0x10203 ] range,606 if (draw->desc->comp[0].depth <= 8) {
478 alpha * mask is in the [ 0 ; 0x1010101 - 4 ] range */607 /* alpha is in the [ 0 ; 0x10203 ] range,
479 alpha = (0x10307 * color->rgba[3] + 0x3) >> 8;608 alpha * mask is in the [ 0 ; 0x1010101 - 4 ] range */
609 alpha = (0x10307 * color->rgba[3] + 0x3) >> 8;
610 } else {
611 alpha = (0x101 * color->rgba[3] + 0x2) >> 8;
612 }
480 nb_planes = (draw->nb_planes - 1) | 1; /* eliminate alpha */613 nb_planes = (draw->nb_planes - 1) | 1; /* eliminate alpha */
481 for (plane = 0; plane < nb_planes; plane++) {614 for (plane = 0; plane < nb_planes; plane++) {
482 nb_comp = draw->pixelstep[plane];615 nb_comp = draw->pixelstep[plane];
@@ -488,34 +621,65 @@ void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color, · 5 unmodified lines
488 subsampling_bounds(draw->hsub[plane], &x_sub, &w_sub, &left, &right);621 subsampling_bounds(draw->hsub[plane], &x_sub, &w_sub, &left, &right);
489 subsampling_bounds(draw->vsub[plane], &y_sub, &h_sub, &top, &bottom);622 subsampling_bounds(draw->vsub[plane], &y_sub, &h_sub, &top, &bottom);
490 for (comp = 0; comp < nb_comp; comp++) {623 for (comp = 0; comp < nb_comp; comp++) {
624 const int depth = draw->desc->comp[comp].depth;
625
491 if (!component_used(draw, plane, comp))626 if (!component_used(draw, plane, comp))
492 continue;627 continue;
493 p = p0 + comp;628 p = p0 + comp;
494 m = mask;629 m = mask;
495 if (top) {630 if (top) {
496 blend_line_hv(p, draw->pixelstep[plane],631 if (depth <= 8) {
497 color->comp[plane].u8[comp], alpha,632 blend_line_hv(p, draw->pixelstep[plane],
498 m, mask_linesize, l2depth, w_sub,633 color->comp[plane].u8[comp], alpha,
499 draw->hsub[plane], draw->vsub[plane],634 m, mask_linesize, l2depth, w_sub,
500 xm0, left, right, top);635 draw->hsub[plane], draw->vsub[plane],
636 xm0, left, right, top);
637 } else {
638 blend_line_hv16(p, draw->pixelstep[plane],
639 color->comp[plane].u16[comp], alpha,
640 m, mask_linesize, l2depth, w_sub,
641 draw->hsub[plane], draw->vsub[plane],
642 xm0, left, right, top);
643 }
501 p += dst_linesize[plane];644 p += dst_linesize[plane];
502 m += top * mask_linesize;645 m += top * mask_linesize;
503 }646 }
504 for (y = 0; y < h_sub; y++) {647 if (depth <= 8) {
505 blend_line_hv(p, draw->pixelstep[plane],648 for (y = 0; y < h_sub; y++) {
506 color->comp[plane].u8[comp], alpha,649 blend_line_hv(p, draw->pixelstep[plane],
507 m, mask_linesize, l2depth, w_sub,650 color->comp[plane].u8[comp], alpha,
508 draw->hsub[plane], draw->vsub[plane],651 m, mask_linesize, l2depth, w_sub,
509 xm0, left, right, 1 << draw->vsub[plane]);652 draw->hsub[plane], draw->vsub[plane],
510 p += dst_linesize[plane];653 xm0, left, right, 1 << draw->vsub[plane]);
511 m += mask_linesize << draw->vsub[plane];654 p += dst_linesize[plane];
655 m += mask_linesize << draw->vsub[plane];
656 }
657 } else {
658 for (y = 0; y < h_sub; y++) {
659 blend_line_hv16(p, draw->pixelstep[plane],
660 color->comp[plane].u16[comp], alpha,
661 m, mask_linesize, l2depth, w_sub,
662 draw->hsub[plane], draw->vsub[plane],
663 xm0, left, right, 1 << draw->vsub[plane]);
664 p += dst_linesize[plane];
665 m += mask_linesize << draw->vsub[plane];
666 }
667 }
668 if (bottom) {
669 if (depth <= 8) {
670 blend_line_hv(p, draw->pixelstep[plane],
671 color->comp[plane].u8[comp], alpha,
672 m, mask_linesize, l2depth, w_sub,
673 draw->hsub[plane], draw->vsub[plane],
674 xm0, left, right, bottom);
675 } else {
676 blend_line_hv16(p, draw->pixelstep[plane],
677 color->comp[plane].u16[comp], alpha,
678 m, mask_linesize, l2depth, w_sub,
679 draw->hsub[plane], draw->vsub[plane],
680 xm0, left, right, bottom);
681 }
512 }682 }
513 if (bottom)
514 blend_line_hv(p, draw->pixelstep[plane],
515 color->comp[plane].u8[comp], alpha,
516 m, mask_linesize, l2depth, w_sub,
517 draw->hsub[plane], draw->vsub[plane],
518 xm0, left, right, bottom);
519 }683 }
520 }684 }
521}685}
libavfilter/drawutils.h+3−3
@@ -60,9 +60,9 @@ typedef struct FFDrawContext { · 59 unmodified lines
60typedef struct FFDrawColor {60typedef struct FFDrawColor {
61 uint8_t rgba[4];61 uint8_t rgba[4];
62 union {62 union {
63 uint32_t u32;63 uint32_t u32[4];
64 uint16_t u16;64 uint16_t u16[8];
65 uint8_t u8[4];65 uint8_t u8[16];
66 } comp[MAX_PLANES];66 } comp[MAX_PLANES];
67} FFDrawColor;67} FFDrawColor;
68 68
tests/ref/fate/filter-pixfmts-pad+32−0
@@ -7,20 +7,52 @@ bgr24 f8b65ad845905c7d0c93ca28dfbb826f · 6 unmodified lines
7bgra 929aac15e848038e367c250037575f9f7bgra 929aac15e848038e367c250037575f9f
8gbrap 6712984b4a068ffa534f0cb35b2adc6f8gbrap 6712984b4a068ffa534f0cb35b2adc6f
9gbrp 3c94d39256db2409015df913fd330a909gbrp 3c94d39256db2409015df913fd330a90
10gbrp10le f206db2a32ad484a59cf3e596bdc2866
11gbrp12le be6463331985e2c8ed7bd910093ca4a2
12gbrp14le 9ae804cf217bec0a737c36c20573cbe5
13gbrp9le 9a86dab5661c213ce2b7e00ae48b4d1f
10gray ddc663a0491df3959d9c5795dceaa72e14gray ddc663a0491df3959d9c5795dceaa72e
15gray16le 468bda6155bdc7a7a20c34d6e599fd16
11rgb0 78d500c8361ab6423a4826a00268c90816rgb0 78d500c8361ab6423a4826a00268c908
12rgb24 17f9e2e0c609009acaf2175c42d4a2a517rgb24 17f9e2e0c609009acaf2175c42d4a2a5
13rgba b157c90191463d34fb3ce77b36c9638618rgba b157c90191463d34fb3ce77b36c96386
19xyz12le 85abf80b77a9236a76ba0b00fcbdea2d
14ya8 5fc0f471207ddf7aa01b07027d56b67220ya8 5fc0f471207ddf7aa01b07027d56b672
15yuv410p cb871dcc1e84a7ef1d21f9237b88cf6e21yuv410p cb871dcc1e84a7ef1d21f9237b88cf6e
16yuv411p aec2c1740de9a62db0d41f4dda9121b022yuv411p aec2c1740de9a62db0d41f4dda9121b0
17yuv420p 4398e408fc35436ce4b20468946f58b623yuv420p 4398e408fc35436ce4b20468946f58b6
24yuv420p10le 74518a7d68457c54da3300e80c683e9c
25yuv420p12le 32086c64c814315aa9253580708a192e
26yuv420p14le 265e9fefb8b92f3cae678eb3cf4e00b4
27yuv420p16le 1ca89e47164d5f2481e39d4ac6eab2ed
28yuv420p9le 59f0209084d1d1dd2861e058d1df63f4
18yuv422p e43d68568d9f782908ba56bf1e09d5d529yuv422p e43d68568d9f782908ba56bf1e09d5d5
30yuv422p10le 18667cf7f87d8ffe1c4cc3db2100c559
31yuv422p12le 71e32220fa1bbdcac95fb57ba0dbd4f0
32yuv422p14le a0064be4d29079a811e5a315341da09a
33yuv422p16le 836057e9999c763697c66c21869492b8
34yuv422p9le 3213bed797e7b4cefa4f174dc33bf246
19yuv440p a7e34de74c96b0224fe1381ec1db2ba735yuv440p a7e34de74c96b0224fe1381ec1db2ba7
36yuv440p10le f91a481e27be7ea4a38a878e5e4330a3
37yuv440p12le 0e9953a09ac09fe5f1523b350cf7cb72
20yuv444p 6bfd89286dc36f2789b77d747ed8fa2238yuv444p 6bfd89286dc36f2789b77d747ed8fa22
39yuv444p10le b10afb5fda970dbce8aac5aab981a8cb
40yuv444p12le 8f1b4b0f91d309fdaaec8a1ba6c7107f
41yuv444p14le 2a87a84fa01237de9c08dd7e9ffbf78d
42yuv444p16le 28508867fe7470c3539f8a84e8fb8271
43yuv444p9le 99d39ef897c6037d6c7aa6e7a0398f84
21yuva420p 842c27169ecdcf6de79f2b787367b51c44yuva420p 842c27169ecdcf6de79f2b787367b51c
45yuva420p10le 336fcb42c5b665c2028661e73325b359
46yuva420p16le ff45de790e7bdd3c25d8aad51289aba9
47yuva420p9le 8ef1f3b3e01b5ce222e4caeec3dec396
22yuva422p 91dcecc4bfdff1f0db9ef8b9b5b9ac2a48yuva422p 91dcecc4bfdff1f0db9ef8b9b5b9ac2a
49yuva422p10le 1ba292c74c8646fd077a6116142b1bc8
50yuva422p16le 383226550fe9c93d6e8bf0d45d1423d1
51yuva422p9le 0fb76788c905c6d448143aa3c5eae116
23yuva444p fb60941a57596b277417a3c7c00aa19452yuva444p fb60941a57596b277417a3c7c00aa194
53yuva444p10le 251ea4ead8300d752eb355a08cbb0352
54yuva444p16le 5b65287e1862d2d9f1ad2cfdcde94661
55yuva444p9le e6946c10b94c271e7ea24b3bcff314e1
24yuvj411p ca967e68759a4956729dd366adc7e7fa56yuvj411p ca967e68759a4956729dd366adc7e7fa
25yuvj420p c00611cd5f1558047d579d8a7d30e38157yuvj420p c00611cd5f1558047d579d8a7d30e381
26yuvj422p b3acdf07147a7598836065836ad8420b58yuvj422p b3acdf07147a7598836065836ad8420b

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t