History

Merge remote branch 'qatar/master'

* qatar/master: vorbisdec: Rename silly "class_" variable to plain "class". simple_idct_alpha: Drop some useless casts. Simplify av_log_missing_feature(). ac3enc: remove check for mismatching channels and channel_layout If AVCodecContext.channels is 0 and AVCodecContext.channel_layout is non-zero, set channels based on channel_layout. If AVCodecContext.channel_layout and AVCodecContext.channels are both non-zero, check to make sure they do not contradict eachother. cosmetics: indentation Check AVCodec.supported_samplerates and AVCodec.channel_layouts in avcodec_open(). aacdec: remove sf_scale and sf_offset. aacdec: use a scale of 2 in the LTP MDCT rather than doubling the coefficient table values from the spec. Define POW_SF2_ZERO in aac.h and use for ff_aac_pow2sf_tabp[] offsets instead of hardcoding 200 everywhere. Large intensity stereo and PNS indices are legal. Clip them instead of erroring out. A magnitude of 100 corresponds to 2^25 so the will most likely result in clipped output anyway. qpeg: use reget_buffer() in decode_frame() ultimotion: use reget_buffer() in ulti_decode_frame() smacker: remove unnecessary call to avctx->release_buffer in decode_frame() avparser: don't av_malloc(0).

Michael Niedermayer committed 15 years ago

Commit 06651992 parents e5d80c7 b23952612 files · +96 −78Browse files

Unified · Split

12 files
  1. libavcodec/aac.h +1 −2
  2. libavcodec/aac_tablegen.h +2 −1
  3. libavcodec/aaccoder.c +4 −4
  4. libavcodec/aacdec.c +23 −28
  5. libavcodec/aacdectab.h +3 −3
  6. libavcodec/ac3enc.c +0 −2
  7. libavcodec/alpha/simple_idct_alpha.c +7 −7
  8. libavcodec/qpeg.c +3 −6
  9. libavcodec/smacker.c +0 −2
  10. libavcodec/ulti.c +2 −5
  11. libavcodec/utils.c +44 −11
  12. libavcodec/vorbisdec.c +7 −7
libavcodec/aac.h+1−2
@@ -130,6 +130,7 @@ typedef struct { · 129 unmodified lines
130130 #define SCALE_MAX_POS 255 ///< scalefactor index maximum value
131131 #define SCALE_MAX_DIFF 60 ///< maximum scalefactor difference allowed by standard
132132 #define SCALE_DIFF_ZERO 60 ///< codebook index corresponding to zero scalefactor indices difference
133+#define POW_SF2_ZERO 200 ///< ff_aac_pow2sf_tab index corresponding to pow(2, 0);
133134
134135 /**
135136 * Long Term Prediction
@@ -292,8 +293,6 @@ typedef struct { · 156 unmodified lines
292293 * @{
293294 */
294295 float *output_data[MAX_CHANNELS]; ///< Points to each element's 'ret' buffer (PCM output).
295− float sf_scale; ///< Pre-scale for correct IMDCT and dsp.float_to_int16.
296− int sf_offset; ///< offset into pow2sf_tab as appropriate for dsp.float_to_int16
297296 /** @} */
298297
299298 DECLARE_ALIGNED(32, float, temp)[128];
libavcodec/aac_tablegen.h+2−1
@@ -29,13 +29,14 @@ · 28 unmodified lines
2929 #include "libavcodec/aac_tables.h"
3030 #else
3131 #include "libavutil/mathematics.h"
32+#include "libavcodec/aac.h"
3233 float ff_aac_pow2sf_tab[428];
3334
3435 void ff_aac_tableinit(void)
3536 {
3637 int i;
3738 for (i = 0; i < 428; i++)
38− ff_aac_pow2sf_tab[i] = pow(2, (i - 200) / 4.);
39+ ff_aac_pow2sf_tab[i] = pow(2, (i - POW_SF2_ZERO) / 4.);
3940 }
4041 #endif /* CONFIG_HARDCODED_TABLES */
4142
libavcodec/aaccoder.c+4−4
@@ -109,8 +109,8 @@ static av_always_inline float quantize_and_encode_band_cost_template( · 108 unmodified lines
109109 int *bits, int BT_ZERO, int BT_UNSIGNED,
110110 int BT_PAIR, int BT_ESC)
111111 {
112− const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512];
113− const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512];
112+ const float IQ = ff_aac_pow2sf_tab[POW_SF2_ZERO + scale_idx - SCALE_ONE_POS + SCALE_DIV_512];
113+ const float Q = ff_aac_pow2sf_tab[POW_SF2_ZERO - scale_idx + SCALE_ONE_POS - SCALE_DIV_512];
114114 const float CLIPPED_ESCAPE = 165140.0f*IQ;
115115 int i, j;
116116 float cost = 0;
@@ -281,7 +281,7 @@ static float find_max_val(int group_len, int swb_size, const float *scaled) { · 164 unmodified lines
281281 }
282282
283283 static int find_min_book(float maxval, int sf) {
284− float Q = ff_aac_pow2sf_tab[200 - sf + SCALE_ONE_POS - SCALE_DIV_512];
284+ float Q = ff_aac_pow2sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512];
285285 float Q34 = sqrtf(Q * sqrtf(Q));
286286 int qmaxval, cb;
287287 qmaxval = maxval * Q34 + 0.4054f;
@@ -956,7 +956,7 @@ static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, · 668 unmodified lines
956956 dist -= b;
957957 }
958958 dist *= 1.0f / 512.0f / lambda;
959− quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[200 - scf + SCALE_ONE_POS - SCALE_DIV_512]);
959+ quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[POW_SF2_ZERO - scf + SCALE_ONE_POS - SCALE_DIV_512]);
960960 if (quant_max >= 8191) { // too much, return to the previous quantizer
961961 sce->sf_idx[w*16+g] = prev_scf;
962962 break;
libavcodec/aacdec.c+23−28
@@ -579,12 +579,6 @@ static av_cold int aac_decode_init(AVCodecContext *avctx) · 578 unmodified lines
579579
580580 ac->random_state = 0x1f2e3d4c;
581581
582− // -1024 - Compensate wrong IMDCT method.
583− // 60 - Required to scale values to the correct range [-32768,32767]
584− // for float to int16 conversion. (1 << (60 / 4)) == 32768
585− ac->sf_scale = 1. / -1024.;
586− ac->sf_offset = 60;
587−
588582 ff_aac_tableinit();
589583
590584 INIT_VLC_STATIC(&vlc_scalefactors,7,FF_ARRAY_ELEMS(ff_aac_scalefactor_code),
@@ -592,9 +586,9 @@ static av_cold int aac_decode_init(AVCodecContext *avctx) · 1 unmodified line
592586 ff_aac_scalefactor_code, sizeof(ff_aac_scalefactor_code[0]), sizeof(ff_aac_scalefactor_code[0]),
593587 352);
594588
595− ff_mdct_init(&ac->mdct, 11, 1, 1.0);
596− ff_mdct_init(&ac->mdct_small, 8, 1, 1.0);
597− ff_mdct_init(&ac->mdct_ltp, 11, 0, 1.0);
589+ ff_mdct_init(&ac->mdct, 11, 1, 1.0/1024.0);
590+ ff_mdct_init(&ac->mdct_small, 8, 1, 1.0/128.0);
591+ ff_mdct_init(&ac->mdct_ltp, 11, 0, -2.0);
598592 // window initialization
599593 ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
600594 ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
@@ -652,7 +646,7 @@ static void decode_ltp(AACContext *ac, LongTermPrediction *ltp, · 51 unmodified lines
652646 int sfb;
653647
654648 ltp->lag = get_bits(gb, 11);
655− ltp->coef = ltp_coef[get_bits(gb, 3)] * ac->sf_scale;
649+ ltp->coef = ltp_coef[get_bits(gb, 3)];
656650 for (sfb = 0; sfb < FFMIN(max_sfb, MAX_LTP_LONG_SFB); sfb++)
657651 ltp->used[sfb] = get_bits1(gb);
658652 }
@@ -790,9 +784,9 @@ static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext *gb, · 131 unmodified lines
790784 enum BandType band_type[120],
791785 int band_type_run_end[120])
792786 {
793− const int sf_offset = ac->sf_offset + (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE ? 12 : 0);
794787 int g, i, idx = 0;
795− int offset[3] = { global_gain, global_gain - 90, 100 };
788+ int offset[3] = { global_gain, global_gain - 90, 0 };
789+ int clipped_offset;
796790 int noise_flag = 1;
797791 static const char *sf_str[3] = { "Global gain", "Noise gain", "Intensity stereo position" };
798792 for (g = 0; g < ics->num_window_groups; g++) {
@@ -804,12 +798,14 @@ static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext *gb, · 5 unmodified lines
804798 } else if ((band_type[idx] == INTENSITY_BT) || (band_type[idx] == INTENSITY_BT2)) {
805799 for (; i < run_end; i++, idx++) {
806800 offset[2] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
807− if (offset[2] > 255U) {
808− av_log(ac->avctx, AV_LOG_ERROR,
809− "%s (%d) out of range.\n", sf_str[2], offset[2]);
810− return -1;
801+ clipped_offset = av_clip(offset[2], -155, 100);
802+ if (offset[2] != clipped_offset) {
803+ av_log_ask_for_sample(ac->avctx, "Intensity stereo "
804+ "position clipped (%d -> %d).\nIf you heard an "
805+ "audible artifact, there may be a bug in the "
806+ "decoder. ", offset[2], clipped_offset);
811807 }
812− sf[idx] = ff_aac_pow2sf_tab[-offset[2] + 300];
808+ sf[idx] = ff_aac_pow2sf_tab[-clipped_offset + POW_SF2_ZERO];
813809 }
814810 } else if (band_type[idx] == NOISE_BT) {
815811 for (; i < run_end; i++, idx++) {
@@ -817,12 +813,14 @@ static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext *gb, · 1 unmodified line
817813 offset[1] += get_bits(gb, 9) - 256;
818814 else
819815 offset[1] += get_vlc2(gb, vlc_scalefactors.table, 7, 3) - 60;
820− if (offset[1] > 255U) {
821− av_log(ac->avctx, AV_LOG_ERROR,
822− "%s (%d) out of range.\n", sf_str[1], offset[1]);
823− return -1;
816+ clipped_offset = av_clip(offset[1], -100, 155);
817+ if (offset[2] != clipped_offset) {
818+ av_log_ask_for_sample(ac->avctx, "Noise gain clipped "
819+ "(%d -> %d).\nIf you heard an audible "
820+ "artifact, there may be a bug in the decoder. ",
821+ offset[1], clipped_offset);
824822 }
825− sf[idx] = -ff_aac_pow2sf_tab[offset[1] + sf_offset + 100];
823+ sf[idx] = -ff_aac_pow2sf_tab[clipped_offset + POW_SF2_ZERO];
826824 }
827825 } else {
828826 for (; i < run_end; i++, idx++) {
@@ -832,7 +830,7 @@ static int decode_scalefactors(AACContext *ac, float sf[120], GetBitContext *gb, · 3 unmodified lines
832830 "%s (%d) out of range.\n", sf_str[0], offset[0]);
833831 return -1;
834832 }
835− sf[idx] = -ff_aac_pow2sf_tab[ offset[0] + sf_offset];
833+ sf[idx] = -ff_aac_pow2sf_tab[offset[0] - 100 + POW_SF2_ZERO];
836834 }
837835 }
838836 }
@@ -1243,7 +1241,6 @@ static av_always_inline float flt16_trunc(float pf) · 404 unmodified lines
12431241 }
12441242
12451243 static av_always_inline void predict(PredictorState *ps, float *coef,
1246− float sf_scale, float inv_sf_scale,
12471244 int output_enable)
12481245 {
12491246 const float a = 0.953125; // 61.0 / 64
@@ -1260,9 +1257,9 @@ static av_always_inline void predict(PredictorState *ps, float *coef, · 10 unmodified lines
12601257
12611258 pv = flt16_round(k1 * r0 + k2 * r1);
12621259 if (output_enable)
1263− *coef += pv * sf_scale;
1260+ *coef += pv;
12641261
1265− e0 = *coef * inv_sf_scale;
1262+ e0 = *coef;
12661263 e1 = e0 - k1 * r0;
12671264
12681265 ps->cor1 = flt16_trunc(alpha * cor1 + r1 * e1);
@@ -1280,7 +1277,6 @@ static av_always_inline void predict(PredictorState *ps, float *coef, · 11 unmodified lines
12801277 static void apply_prediction(AACContext *ac, SingleChannelElement *sce)
12811278 {
12821279 int sfb, k;
1283− float sf_scale = ac->sf_scale, inv_sf_scale = 1 / ac->sf_scale;
12841280
12851281 if (!sce->ics.predictor_initialized) {
12861282 reset_all_predictors(sce->predictor_state);
@@ -1291,7 +1287,6 @@ static void apply_prediction(AACContext *ac, SingleChannelElement *sce) · 4 unmodified lines
12911287 for (sfb = 0; sfb < ff_aac_pred_sfb_max[ac->m4ac.sampling_index]; sfb++) {
12921288 for (k = sce->ics.swb_offset[sfb]; k < sce->ics.swb_offset[sfb + 1]; k++) {
12931289 predict(&sce->predictor_state[k], &sce->coeffs[k],
1294− sf_scale, inv_sf_scale,
12951290 sce->ics.predictor_present && sce->ics.prediction_used[sfb]);
12961291 }
12971292 }
libavcodec/aacdectab.h+3−3
@@ -36,11 +36,11 @@ · 35 unmodified lines
3636 #include <stdint.h>
3737
3838 /* @name ltp_coef
39− * Table of the LTP coefficient (multiplied by 2)
39+ * Table of the LTP coefficients
4040 */
4141 static const float ltp_coef[8] = {
42− 1.141658, 1.393232, 1.626008, 1.822608,
43− 1.969800, 2.135788, 2.2389202, 2.739066,
42+ 0.570829, 0.696616, 0.813004, 0.911304,
43+ 0.984900, 1.067894, 1.194601, 1.369533,
4444 };
4545
4646 /* @name tns_tmp2_map
libavcodec/ac3enc.c+0−2
@@ -1962,8 +1962,6 @@ static av_cold int set_channel_info(AC3EncodeContext *s, int channels, · 1961 unmodified lines
19621962 ch_layout = *channel_layout;
19631963 if (!ch_layout)
19641964 ch_layout = avcodec_guess_channel_layout(channels, CODEC_ID_AC3, NULL);
1965− if (av_get_channel_layout_nb_channels(ch_layout) != channels)
1966− return AVERROR(EINVAL);
19671965
19681966 s->lfe_on = !!(ch_layout & AV_CH_LOW_FREQUENCY);
19691967 s->channels = channels;
libavcodec/alpha/simple_idct_alpha.c+7−7
@@ -33,13 +33,13 @@ · 32 unmodified lines
3333 // cos(i * M_PI / 16) * sqrt(2) * (1 << 14)
3434 // W4 is actually exactly 16384, but using 16383 works around
3535 // accumulating rounding errors for some encoders
36−#define W1 ((int_fast32_t) 22725)
37−#define W2 ((int_fast32_t) 21407)
38−#define W3 ((int_fast32_t) 19266)
39−#define W4 ((int_fast32_t) 16383)
40−#define W5 ((int_fast32_t) 12873)
41−#define W6 ((int_fast32_t) 8867)
42−#define W7 ((int_fast32_t) 4520)
36+#define W1 22725
37+#define W2 21407
38+#define W3 19266
39+#define W4 16383
40+#define W5 12873
41+#define W6 8867
42+#define W7 4520
4343 #define ROW_SHIFT 11
4444 #define COL_SHIFT 20
4545
libavcodec/qpeg.c+3−6
@@ -259,12 +259,9 @@ static int decode_frame(AVCodecContext *avctx, · 258 unmodified lines
259259 int delta;
260260 const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL);
261261
262− if(p->data[0])
263− avctx->release_buffer(avctx, p);
264−
265− p->reference= 0;
266− if(avctx->get_buffer(avctx, p) < 0){
267− av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
262+ p->reference = 3;
263+ if (avctx->reget_buffer(avctx, p) < 0) {
264+ av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
268265 return -1;
269266 }
270267 outdata = a->pic.data[0];
libavcodec/smacker.c+0−2
@@ -360,8 +360,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac · 359 unmodified lines
360360
361361 if(buf_size <= 769)
362362 return 0;
363− if(smk->pic.data[0])
364− avctx->release_buffer(avctx, &smk->pic);
365363
366364 smk->pic.reference = 1;
367365 smk->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
libavcodec/ulti.c+2−5
@@ -224,13 +224,10 @@ static int ulti_decode_frame(AVCodecContext *avctx, · 223 unmodified lines
224224 int skip;
225225 int tmp;
226226
227− if(s->frame.data[0])
228− avctx->release_buffer(avctx, &s->frame);
229−
230227 s->frame.reference = 1;
231228 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
232− if(avctx->get_buffer(avctx, &s->frame) < 0) {
233− av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
229+ if (avctx->reget_buffer(avctx, &s->frame) < 0) {
230+ av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
234231 return -1;
235232 }
236233
libavcodec/utils.c+44−11
@@ -555,15 +555,50 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) · 554 unmodified lines
555555 ret = AVERROR(EINVAL);
556556 goto free_and_end;
557557 }
558− if (avctx->codec->sample_fmts && avctx->codec->encode) {
558+ if (avctx->codec->encode) {
559559 int i;
560− for (i = 0; avctx->codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; i++)
561− if (avctx->sample_fmt == avctx->codec->sample_fmts[i])
562− break;
563− if (avctx->codec->sample_fmts[i] == AV_SAMPLE_FMT_NONE) {
564− av_log(avctx, AV_LOG_ERROR, "Specified sample_fmt is not supported.\n");
565− ret = AVERROR(EINVAL);
566− goto free_and_end;
560+ if (avctx->codec->sample_fmts) {
561+ for (i = 0; avctx->codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; i++)
562+ if (avctx->sample_fmt == avctx->codec->sample_fmts[i])
563+ break;
564+ if (avctx->codec->sample_fmts[i] == AV_SAMPLE_FMT_NONE) {
565+ av_log(avctx, AV_LOG_ERROR, "Specified sample_fmt is not supported.\n");
566+ ret = AVERROR(EINVAL);
567+ goto free_and_end;
568+ }
569+ }
570+ if (avctx->codec->supported_samplerates) {
571+ for (i = 0; avctx->codec->supported_samplerates[i] != 0; i++)
572+ if (avctx->sample_rate == avctx->codec->supported_samplerates[i])
573+ break;
574+ if (avctx->codec->supported_samplerates[i] == 0) {
575+ av_log(avctx, AV_LOG_ERROR, "Specified sample_rate is not supported\n");
576+ ret = AVERROR(EINVAL);
577+ goto free_and_end;
578+ }
579+ }
580+ if (avctx->codec->channel_layouts) {
581+ if (!avctx->channel_layout) {
582+ av_log(avctx, AV_LOG_WARNING, "channel_layout not specified\n");
583+ } else {
584+ for (i = 0; avctx->codec->channel_layouts[i] != 0; i++)
585+ if (avctx->channel_layout == avctx->codec->channel_layouts[i])
586+ break;
587+ if (avctx->codec->channel_layouts[i] == 0) {
588+ av_log(avctx, AV_LOG_ERROR, "Specified channel_layout is not supported\n");
589+ ret = AVERROR(EINVAL);
590+ goto free_and_end;
591+ }
592+ }
593+ }
594+ if (avctx->channel_layout && avctx->channels) {
595+ if (av_get_channel_layout_nb_channels(avctx->channel_layout) != avctx->channels) {
596+ av_log(avctx, AV_LOG_ERROR, "channel layout does not match number of channels\n");
597+ ret = AVERROR(EINVAL);
598+ goto free_and_end;
599+ }
600+ } else if (avctx->channel_layout) {
601+ avctx->channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
567602 }
568603 }
569604
@@ -1194,11 +1229,9 @@ void av_log_missing_feature(void *avc, const char *feature, int want_sample) · 624 unmodified lines
11941229 av_log(avc, AV_LOG_WARNING, "%s not implemented. Update your FFmpeg "
11951230 "version to the newest one from Git. If the problem still "
11961231 "occurs, it means that your file has a feature which has not "
1197− "been implemented.", feature);
1232+ "been implemented.\n", feature);
11981233 if(want_sample)
11991234 av_log_ask_for_sample(avc, NULL);
1200− else
1201− av_log(avc, AV_LOG_WARNING, "\n");
12021235 }
12031236
12041237 void av_log_ask_for_sample(void *avc, const char *msg, ...)
libavcodec/vorbisdec.c+7−7
@@ -1138,7 +1138,7 @@ static int vorbis_floor1_decode(vorbis_context *vc, · 1137 unmodified lines
11381138 uint_fast16_t floor1_Y[258];
11391139 uint_fast16_t floor1_Y_final[258];
11401140 int floor1_flag[258];
1141− uint_fast8_t class_;
1141+ uint_fast8_t class;
11421142 uint_fast8_t cdim;
11431143 uint_fast8_t cbits;
11441144 uint_fast8_t csub;
@@ -1162,20 +1162,20 @@ static int vorbis_floor1_decode(vorbis_context *vc, · 17 unmodified lines
11621162
11631163 offset = 2;
11641164 for (i = 0; i < vf->partitions; ++i) {
1165− class_ = vf->partition_class[i];
1166− cdim = vf->class_dimensions[class_];
1167− cbits = vf->class_subclasses[class_];
1165+ class = vf->partition_class[i];
1166+ cdim = vf->class_dimensions[class];
1167+ cbits = vf->class_subclasses[class];
11681168 csub = (1 << cbits) - 1;
11691169 cval = 0;
11701170
11711171 AV_DEBUG("Cbits %d \n", cbits);
11721172
11731173 if (cbits) // this reads all subclasses for this partition's class
1174− cval = get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table,
1175− vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3);
1174+ cval = get_vlc2(gb, vc->codebooks[vf->class_masterbook[class]].vlc.table,
1175+ vc->codebooks[vf->class_masterbook[class]].nb_bits, 3);
11761176
11771177 for (j = 0; j < cdim; ++j) {
1178− book = vf->subclass_books[class_][cval & csub];
1178+ book = vf->subclass_books[class][cval & csub];
11791179
11801180 AV_DEBUG("book %d Cbits %d cval %d bits:%d \n", book, cbits, cval, get_bits_count(gb));
11811181

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