History

avcodec/mpegvideo: Only keep the actually used unquantize funcs

For all encoders and all decoders except MPEG-4 the unquantize functions to use don't change at all and therefore needn't be kept in the context. So discard them after setting them; for MPEG-4, the functions get assigned on a per-frame basis. Decoders not using any unquantize functions (H.261, MPEG-1/2) as well as decoders that only call ff_mpv_reconstruct_mb() through error resilience (RV30/40, the VC-1 family) don't have the remaining pointers set at all.

Andreas Rheinhardt committed 1 year ago

Commit e5a33c81 parent 917652d15 files · +99 −61Browse files

Unified · Split

15 files
  1. libavcodec/arm/mpegvideo_arm.c +2 −2
  2. libavcodec/arm/mpegvideo_arm.h +2 −2
  3. libavcodec/arm/mpegvideo_armv5te.c +1 −1
  4. libavcodec/h263dec.c +6 −10
  5. libavcodec/mips/mpegvideo_init_mips.c +5 −4
  6. libavcodec/mpeg4videodec.c +14 −0
  7. libavcodec/mpeg4videodec.h +5 −0
  8. libavcodec/mpegvideo.c +0 −2
  9. libavcodec/mpegvideo.h +0 −12
  10. libavcodec/mpegvideo_enc.c +21 −11
  11. libavcodec/mpegvideo_unquantize.c +8 −7
  12. libavcodec/mpegvideo_unquantize.h +31 −6
  13. libavcodec/neon/mpegvideo.c +1 −1
  14. libavcodec/ppc/mpegvideo_altivec.c +1 −1
  15. libavcodec/x86/mpegvideo.c +2 −2
libavcodec/arm/mpegvideo_arm.c+2−2
@@ -46,12 +46,12 @@ void ff_dct_unquantize_h263_inter_neon(MpegEncContext *s, int16_t *block, · 45 unmodified lines
4646 void ff_dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block,
4747 int n, int qscale);
4848
49−av_cold void ff_mpv_common_init_arm(MpegEncContext *s)
49+av_cold void ff_mpv_unquantize_init_arm(MPVUnquantDSPContext *s, int bitexact)
5050 {
5151 int cpu_flags = av_get_cpu_flags();
5252
5353 if (have_armv5te(cpu_flags))
54− ff_mpv_common_init_armv5te(s);
54+ ff_mpv_unquantize_init_armv5te(s);
5555
5656 if (have_neon(cpu_flags)) {
5757 s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_neon;
libavcodec/arm/mpegvideo_arm.h+2−2
@@ -19,8 +19,8 @@ · 18 unmodified lines
1919 #ifndef AVCODEC_ARM_MPEGVIDEO_ARM_H
2020 #define AVCODEC_ARM_MPEGVIDEO_ARM_H
2121
22−#include "libavcodec/mpegvideo.h"
22+#include "libavcodec/mpegvideo_unquantize.h"
2323
24−void ff_mpv_common_init_armv5te(MpegEncContext *s);
24+void ff_mpv_unquantize_init_armv5te(MPVUnquantDSPContext *s);
2525
2626 #endif /* AVCODEC_ARM_MPEGVIDEO_ARM_H */
libavcodec/arm/mpegvideo_armv5te.c+1−1
@@ -95,7 +95,7 @@ static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s, · 94 unmodified lines
9595 ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1);
9696 }
9797
98−av_cold void ff_mpv_common_init_armv5te(MpegEncContext *s)
98+av_cold void ff_mpv_unquantize_init_armv5te(MPVUnquantDSPContext *s)
9999 {
100100 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te;
101101 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te;
libavcodec/h263dec.c+6−10
@@ -44,6 +44,7 @@ · 43 unmodified lines
4444 #include "mpegvideo.h"
4545 #include "mpegvideodata.h"
4646 #include "mpegvideodec.h"
47+#include "mpegvideo_unquantize.h"
4748 #include "msmpeg4dec.h"
4849 #include "thread.h"
4950 #include "wmv2dec.h"
@@ -90,6 +91,7 @@ static enum AVPixelFormat h263_get_format(AVCodecContext *avctx) · 40 unmodified lines
9091 av_cold int ff_h263_decode_init(AVCodecContext *avctx)
9192 {
9293 MpegEncContext *s = avctx->priv_data;
94+ MPVUnquantDSPContext unquant_dsp_ctx;
9395 int ret;
9496
9597 s->out_format = FMT_H263;
@@ -105,10 +107,12 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) · 9 unmodified lines
105107 s->y_dc_scale_table =
106108 s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
107109
110+ ff_mpv_unquantize_init(&unquant_dsp_ctx,
111+ avctx->flags & AV_CODEC_FLAG_BITEXACT, 0);
108112 // dct_unquantize defaults for H.263;
109113 // they might change on a per-frame basis for MPEG-4.
110− s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
111− s->dct_unquantize_inter = s->dct_unquantize_h263_inter;
114+ s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra;
115+ s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter;
112116
113117 /* select sub codec */
114118 switch (avctx->codec->id) {
@@ -117,9 +121,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) · 2 unmodified lines
117121 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
118122 break;
119123 case AV_CODEC_ID_MPEG4:
120− // dct_unquantize_inter is only used with MPEG-2 quantizers,
121− // so we can already set dct_unquantize_inter here once and for all.
122− s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter;
123124 break;
124125 case AV_CODEC_ID_MSMPEG4V1:
125126 s->h263_pred = 1;
@@ -508,11 +509,6 @@ retry: · 382 unmodified lines
508509 goto retry;
509510 if (s->studio_profile != (s->idsp.idct == NULL))
510511 ff_mpv_idct_init(s);
511− if (s->mpeg_quant) {
512− s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra;
513− } else {
514− s->dct_unquantize_intra = s->dct_unquantize_h263_intra;
515− }
516512 }
517513
518514 /* After H.263 & MPEG-4 header decode we have the height, width,
libavcodec/mips/mpegvideo_init_mips.c+5−4
@@ -24,7 +24,8 @@ · 23 unmodified lines
2424 #include "h263dsp_mips.h"
2525 #include "mpegvideo_mips.h"
2626
27−av_cold void ff_mpv_common_init_mips(MpegEncContext *s)
27+av_cold void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s,
28+ int bitexact, int q_scale_type)
2829 {
2930 int cpu_flags = av_get_cpu_flags();
3031
@@ -34,15 +35,15 @@ av_cold void ff_mpv_common_init_mips(MpegEncContext *s) · 3 unmodified lines
3435 s->dct_unquantize_mpeg1_intra = ff_dct_unquantize_mpeg1_intra_mmi;
3536 s->dct_unquantize_mpeg1_inter = ff_dct_unquantize_mpeg1_inter_mmi;
3637
37− if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT))
38− if (!s->q_scale_type)
38+ if (!bitexact)
39+ if (!q_scale_type)
3940 s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi;
4041 }
4142
4243 if (have_msa(cpu_flags)) {
4344 s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_msa;
4445 s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_msa;
45− if (!s->q_scale_type)
46+ if (!q_scale_type)
4647 s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa;
4748 }
4849 }
libavcodec/mpeg4videodec.c+14−0
@@ -35,6 +35,7 @@ · 34 unmodified lines
3535 #include "mpegvideo.h"
3636 #include "mpegvideodata.h"
3737 #include "mpegvideodec.h"
38+#include "mpegvideo_unquantize.h"
3839 #include "mpeg4video.h"
3940 #include "mpeg4videodata.h"
4041 #include "mpeg4videodec.h"
@@ -3390,6 +3391,9 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, · 3349 unmodified lines
33903391 }
33913392 }
33923393
3394+ s->dct_unquantize_intra = s->mpeg_quant ? ctx->dct_unquantize_mpeg2_intra
3395+ : ctx->dct_unquantize_h263_intra;
3396+
33933397 end:
33943398 /* detect buggy encoders which don't set the low_delay flag
33953399 * (divx4/xvid/opendivx). Note we cannot detect divx5 without B-frames
@@ -3862,6 +3866,7 @@ static av_cold int decode_init(AVCodecContext *avctx) · 466 unmodified lines
38623866 static AVOnce init_static_once = AV_ONCE_INIT;
38633867 Mpeg4DecContext *ctx = avctx->priv_data;
38643868 MpegEncContext *s = &ctx->m;
3869+ MPVUnquantDSPContext unquant_dsp_ctx;
38653870 int ret;
38663871
38673872 ctx->divx_version =
@@ -3872,6 +3877,15 @@ static av_cold int decode_init(AVCodecContext *avctx) · 4 unmodified lines
38723877 if ((ret = ff_h263_decode_init(avctx)) < 0)
38733878 return ret;
38743879
3880+ ff_mpv_unquantize_init(&unquant_dsp_ctx,
3881+ avctx->flags & AV_CODEC_FLAG_BITEXACT, 0);
3882+
3883+ ctx->dct_unquantize_h263_intra = unquant_dsp_ctx.dct_unquantize_h263_intra;
3884+ ctx->dct_unquantize_mpeg2_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra;
3885+ // dct_unquantize_inter is only used with MPEG-2 quantizers,
3886+ // so we can already set dct_unquantize_inter here once and for all.
3887+ s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter;
3888+
38753889 s->h263_pred = 1;
38763890 s->low_delay = 0; /* default, might be overridden in the vol header during header parsing */
38773891 s->decode_mb = mpeg4_decode_mb;
libavcodec/mpeg4videodec.h+5−0
@@ -88,6 +88,11 @@ typedef struct Mpeg4DecContext { · 87 unmodified lines
8888
8989 Mpeg4VideoDSPContext mdsp;
9090
91+ void (*dct_unquantize_mpeg2_intra)(MpegEncContext *s,
92+ int16_t *block, int n, int qscale);
93+ void (*dct_unquantize_h263_intra)(MpegEncContext *s,
94+ int16_t *block, int n, int qscale);
95+
9196 DECLARE_ALIGNED(8, int32_t, block32)[12][64];
9297 // 0 = DCT, 1 = DPCM top to bottom scan, -1 = DPCM bottom to top scan
9398 int dpcm_direction;
libavcodec/mpegvideo.c+0−2
@@ -112,8 +112,6 @@ av_cold void ff_mpv_idct_init(MpegEncContext *s) · 111 unmodified lines
112112 s->idsp.idct_permutation);
113113 ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan,
114114 s->idsp.idct_permutation);
115−
116− ff_mpv_unquantize_init(s);
117115 }
118116
119117 static av_cold int init_duplicate_context(MpegEncContext *s)
libavcodec/mpegvideo.h+0−12
@@ -326,18 +326,6 @@ typedef struct MpegEncContext { · 325 unmodified lines
326326 #define SLICE_END -2 ///<end marker found
327327 #define SLICE_NOEND -3 ///<no end marker or error found but mb count exceeded
328328
329− void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s,
330− int16_t *block/*align 16*/, int n, int qscale);
331− void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s,
332− int16_t *block/*align 16*/, int n, int qscale);
333− void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s,
334− int16_t *block/*align 16*/, int n, int qscale);
335− void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s,
336− int16_t *block/*align 16*/, int n, int qscale);
337− void (*dct_unquantize_h263_intra)(struct MpegEncContext *s,
338− int16_t *block/*align 16*/, int n, int qscale);
339− void (*dct_unquantize_h263_inter)(struct MpegEncContext *s,
340− int16_t *block/*align 16*/, int n, int qscale);
341329 void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both)
342330 int16_t *block/*align 16*/, int n, int qscale);
343331 void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both)
libavcodec/mpegvideo_enc.c+21−11
@@ -60,6 +60,7 @@ · 59 unmodified lines
6060 #include "mjpegenc_common.h"
6161 #include "mathops.h"
6262 #include "mpegutils.h"
63+#include "mpegvideo_unquantize.h"
6364 #include "mjpegenc.h"
6465 #include "speedhqenc.h"
6566 #include "msmpeg4enc.h"
@@ -309,6 +310,25 @@ av_cold void ff_dct_encode_init(MPVEncContext *const s) · 243 unmodified lines
309310 s->dct_quantize = dct_quantize_trellis_c;
310311 }
311312
313+static av_cold void init_unquantize(MpegEncContext *const s, AVCodecContext *avctx)
314+{
315+ MPVUnquantDSPContext unquant_dsp_ctx;
316+
317+ ff_mpv_unquantize_init(&unquant_dsp_ctx,
318+ avctx->flags & AV_CODEC_FLAG_BITEXACT, s->q_scale_type);
319+
320+ if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
321+ s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra;
322+ s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter;
323+ } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) {
324+ s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra;
325+ s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter;
326+ } else {
327+ s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg1_intra;
328+ s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg1_inter;
329+ }
330+}
331+
312332 static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx)
313333 {
314334 MPVEncContext *const s = &m->s;
@@ -1012,6 +1032,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 697 unmodified lines
10121032 * to the slice contexts, so we initialize various fields of it
10131033 * before calling ff_mpv_common_init(). */
10141034 ff_mpv_idct_init(&s->c);
1035+ init_unquantize(&s->c, avctx);
10151036 ff_fdctdsp_init(&s->fdsp, avctx);
10161037 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
10171038 ff_pixblockdsp_init(&s->pdsp, avctx);
@@ -1030,17 +1051,6 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 12 unmodified lines
10301051
10311052 ff_dct_encode_init(s);
10321053
1033− if (s->c.mpeg_quant || s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO) {
1034− s->c.dct_unquantize_intra = s->c.dct_unquantize_mpeg2_intra;
1035− s->c.dct_unquantize_inter = s->c.dct_unquantize_mpeg2_inter;
1036− } else if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) {
1037− s->c.dct_unquantize_intra = s->c.dct_unquantize_h263_intra;
1038− s->c.dct_unquantize_inter = s->c.dct_unquantize_h263_inter;
1039− } else {
1040− s->c.dct_unquantize_intra = s->c.dct_unquantize_mpeg1_intra;
1041− s->c.dct_unquantize_inter = s->c.dct_unquantize_mpeg1_inter;
1042− }
1043−
10441054 if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263) {
10451055 ff_h263_encode_init(m);
10461056 #if CONFIG_MSMPEG4ENC
libavcodec/mpegvideo_unquantize.c+8−7
@@ -246,28 +246,29 @@ static void dct_unquantize_h263_inter_c(MpegEncContext *s, · 245 unmodified lines
246246 }
247247 }
248248
249−av_cold void ff_mpv_unquantize_init(MpegEncContext *s)
249+av_cold void ff_mpv_unquantize_init(MPVUnquantDSPContext *s,
250+ int bitexact, int q_scale_type)
250251 {
251252 s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c;
252253 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c;
253254 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c;
254255 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c;
255256 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c;
256− if (s->avctx->flags & AV_CODEC_FLAG_BITEXACT)
257+ if (bitexact)
257258 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact;
258259 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c;
259260
260261 #if HAVE_INTRINSICS_NEON
261− ff_mpv_common_init_neon(s);
262+ ff_mpv_unquantize_init_neon(s, bitexact);
262263 #endif
263264
264265 #if ARCH_ARM
265− ff_mpv_common_init_arm(s);
266+ ff_mpv_unquantize_init_arm(s, bitexact);
266267 #elif ARCH_PPC
267− ff_mpv_common_init_ppc(s);
268+ ff_mpv_unquantize_init_ppc(s, bitexact);
268269 #elif ARCH_X86
269− ff_mpv_common_init_x86(s);
270+ ff_mpv_unquantize_init_x86(s, bitexact);
270271 #elif ARCH_MIPS
271− ff_mpv_common_init_mips(s);
272+ ff_mpv_unquantize_init_mips(s, bitexact, q_scale_type);
272273 #endif
273274 }
libavcodec/mpegvideo_unquantize.h+31−6
@@ -25,13 +25,38 @@ · 24 unmodified lines
2525 #ifndef AVCODEC_MPEGVIDEO_UNQUANTIZE_H
2626 #define AVCODEC_MPEGVIDEO_UNQUANTIZE_H
2727
28+#include <stdint.h>
29+
30+#include "config.h"
31+
2832 typedef struct MpegEncContext MpegEncContext;
2933
30−void ff_mpv_unquantize_init(MpegEncContext *s);
31−void ff_mpv_common_init_arm(MpegEncContext *s);
32−void ff_mpv_common_init_neon(MpegEncContext *s);
33−void ff_mpv_common_init_ppc(MpegEncContext *s);
34−void ff_mpv_common_init_x86(MpegEncContext *s);
35−void ff_mpv_common_init_mips(MpegEncContext *s);
34+typedef struct MPVUnquantDSPContext {
35+ void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s,
36+ int16_t *block/*align 16*/, int n, int qscale);
37+ void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s,
38+ int16_t *block/*align 16*/, int n, int qscale);
39+ void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s,
40+ int16_t *block/*align 16*/, int n, int qscale);
41+ void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s,
42+ int16_t *block/*align 16*/, int n, int qscale);
43+ void (*dct_unquantize_h263_intra)(struct MpegEncContext *s,
44+ int16_t *block/*align 16*/, int n, int qscale);
45+ void (*dct_unquantize_h263_inter)(struct MpegEncContext *s,
46+ int16_t *block/*align 16*/, int n, int qscale);
47+} MPVUnquantDSPContext;
48+
49+#if !ARCH_MIPS
50+#define ff_mpv_unquantize_init(s, bitexact, q_scale_type) ff_mpv_unquantize_init(s, bitexact)
51+#endif
52+
53+void ff_mpv_unquantize_init(MPVUnquantDSPContext *s,
54+ int bitexact, int q_scale_type);
55+void ff_mpv_unquantize_init_arm (MPVUnquantDSPContext *s, int bitexact);
56+void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s, int bitexact);
57+void ff_mpv_unquantize_init_ppc (MPVUnquantDSPContext *s, int bitexact);
58+void ff_mpv_unquantize_init_x86 (MPVUnquantDSPContext *s, int bitexact);
59+void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s, int bitexact,
60+ int q_scale_type);
3661
3762 #endif /* AVCODEC_MPEGVIDEO_UNQUANTIZE_H */
libavcodec/neon/mpegvideo.c+1−1
@@ -125,7 +125,7 @@ static void dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block, · 124 unmodified lines
125125 }
126126
127127
128−av_cold void ff_mpv_common_init_neon(MpegEncContext *s)
128+av_cold void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s, int bitexact)
129129 {
130130 int cpu_flags = av_get_cpu_flags();
131131
libavcodec/ppc/mpegvideo_altivec.c+1−1
@@ -103,7 +103,7 @@ static void dct_unquantize_h263_altivec(MpegEncContext *s, · 102 unmodified lines
103103
104104 #endif /* HAVE_ALTIVEC */
105105
106−av_cold void ff_mpv_common_init_ppc(MpegEncContext *s)
106+av_cold void ff_mpv_unquantize_init_ppc(MPVUnquantDSPContext *s, int bitexact)
107107 {
108108 #if HAVE_ALTIVEC
109109 if (!PPC_ALTIVEC(av_get_cpu_flags()))
libavcodec/x86/mpegvideo.c+2−2
@@ -450,7 +450,7 @@ __asm__ volatile( · 449 unmodified lines
450450
451451 #endif /* HAVE_MMX_INLINE */
452452
453−av_cold void ff_mpv_common_init_x86(MpegEncContext *s)
453+av_cold void ff_mpv_unquantize_init_x86(MPVUnquantDSPContext *s, int bitexact)
454454 {
455455 #if HAVE_MMX_INLINE
456456 int cpu_flags = av_get_cpu_flags();
@@ -460,7 +460,7 @@ av_cold void ff_mpv_common_init_x86(MpegEncContext *s) · 3 unmodified lines
460460 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx;
461461 s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx;
462462 s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_mmx;
463− if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT))
463+ if (!bitexact)
464464 s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx;
465465 s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx;
466466 }

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