History

avcodec/mpegutils: Don't use MB_TYPE_L[01] for mpegvideo

MB_TYPE_L[01] is based upon H.264 terminology (it stands for list); yet the mpegvideo based decoders don't have lists of reference frames, they have at most one forward and one backward reference. So use terminology based upon this. This also has a second advantage: MB_TYPE_L[01] is actually an OR of two flags (which are set independently for H.264, but aren't for mpegvideo). Switching to different flags makes the flags fit into an int16_t, which will be useful in future commits. The only downside to this is a very small amount of code in error_resilience.c and mpegutils.c (the only code shared between the H.264 decoder and mpegvideo).

Andreas Rheinhardt committed 2 years ago

Commit f5d5b801 parent 07ae09b12 files · +123 −111Browse files

Showing the changes to libavcodec (12 of 12 files). Show all

Unified · Split

12 files
  1. libavcodec/error_resilience.c +4 −4
  2. libavcodec/h261dec.c +2 −2
  3. libavcodec/ituh263dec.c +22 −22
  4. libavcodec/ituh263enc.c +2 −2
  5. libavcodec/mpeg12dec.c +22 −22
  6. libavcodec/mpeg4video.c +3 −3
  7. libavcodec/mpeg4videodec.c +25 −28
  8. libavcodec/mpegutils.c +14 −9
  9. libavcodec/mpegutils.h +10 −0
  10. libavcodec/msmpeg4dec.c +4 −4
  11. libavcodec/rv34.c +9 −9
  12. libavcodec/wmv2dec.c +6 −6
libavcodec/error_resilience.c+4−4
@@ -902,6 +902,7 @@ void ff_er_frame_end(ERContext *s, int *decode_error_flags) · 901 unmodified lines
902902 int threshold = 50;
903903 int is_intra_likely;
904904 int size = s->b8_stride * 2 * s->mb_height;
905+ int guessed_mb_type;
905906
906907 /* We do not support ER of field pictures yet,
907908 * though it should not crash if enabled. */
@@ -1117,16 +1118,15 @@ void ff_er_frame_end(ERContext *s, int *decode_error_flags) · 209 unmodified lines
11171118 is_intra_likely = is_intra_more_likely(s);
11181119
11191120 /* set unknown mb-type to most likely */
1121+ guessed_mb_type = is_intra_likely ? MB_TYPE_INTRA4x4 :
1122+ (MB_TYPE_16x16 | (s->avctx->codec_id == AV_CODEC_ID_H264 ? MB_TYPE_L0 : MB_TYPE_FORWARD_MV));
11201123 for (i = 0; i < s->mb_num; i++) {
11211124 const int mb_xy = s->mb_index2xy[i];
11221125 int error = s->error_status_table[mb_xy];
11231126 if (!((error & ER_DC_ERROR) && (error & ER_MV_ERROR)))
11241127 continue;
11251128
1126− if (is_intra_likely)
1127− s->cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA4x4;
1128− else
1129− s->cur_pic.mb_type[mb_xy] = MB_TYPE_16x16 | MB_TYPE_L0;
1129+ s->cur_pic.mb_type[mb_xy] = guessed_mb_type;
11301130 }
11311131
11321132 // change inter to intra blocks if no reference frames are available
libavcodec/h261dec.c+2−2
@@ -232,7 +232,7 @@ static int h261_decode_mb_skipped(H261DecContext *h, int mba1, int mba2) · 231 unmodified lines
232232
233233 s->mv_dir = MV_DIR_FORWARD;
234234 s->mv_type = MV_TYPE_16X16;
235− s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
235+ s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
236236 s->mv[0][0][0] = 0;
237237 s->mv[0][0][1] = 0;
238238 s->mb_skipped = 1;
@@ -460,7 +460,7 @@ static int h261_decode_mb(H261DecContext *h) · 221 unmodified lines
460460 //set motion vectors
461461 s->mv_dir = MV_DIR_FORWARD;
462462 s->mv_type = MV_TYPE_16X16;
463− s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0;
463+ s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
464464 s->mv[0][0][0] = h->current_mv_x * 2; // gets divided by 2 in motion compensation
465465 s->mv[0][0][1] = h->current_mv_y * 2;
466466
libavcodec/ituh263dec.c+22−22
@@ -60,18 +60,18 @@ · 59 unmodified lines
6060 #define CBPC_B_VLC_BITS 3
6161
6262 static const int h263_mb_type_b_map[15]= {
63− MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
64− MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP,
65− MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT,
66− MB_TYPE_L0 | MB_TYPE_16x16,
67− MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_16x16,
68− MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
69− MB_TYPE_L1 | MB_TYPE_16x16,
70− MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_16x16,
71− MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
72− MB_TYPE_L0L1 | MB_TYPE_16x16,
73− MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_16x16,
74− MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
63+ MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV,
64+ MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV | MB_TYPE_CBP,
65+ MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV | MB_TYPE_CBP | MB_TYPE_QUANT,
66+ MB_TYPE_FORWARD_MV | MB_TYPE_16x16,
67+ MB_TYPE_FORWARD_MV | MB_TYPE_CBP | MB_TYPE_16x16,
68+ MB_TYPE_FORWARD_MV | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
69+ MB_TYPE_BACKWARD_MV | MB_TYPE_16x16,
70+ MB_TYPE_BACKWARD_MV | MB_TYPE_CBP | MB_TYPE_16x16,
71+ MB_TYPE_BACKWARD_MV | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
72+ MB_TYPE_BIDIR_MV | MB_TYPE_16x16,
73+ MB_TYPE_BIDIR_MV | MB_TYPE_CBP | MB_TYPE_16x16,
74+ MB_TYPE_BIDIR_MV | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
7575 0, //stuffing
7676 MB_TYPE_INTRA4x4 | MB_TYPE_CBP,
7777 MB_TYPE_INTRA4x4 | MB_TYPE_CBP | MB_TYPE_QUANT,
@@ -363,7 +363,7 @@ static void preview_obmc(MpegEncContext *s){ · 285 unmodified lines
363363 mot_val[1 ]= mot_val[3 ]=
364364 mot_val[1+stride]= mot_val[3+stride]= 0;
365365
366− s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
366+ s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
367367 goto end;
368368 }
369369 cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 2);
@@ -382,7 +382,7 @@ static void preview_obmc(MpegEncContext *s){ · 12 unmodified lines
382382 }
383383
384384 if ((cbpc & 16) == 0) {
385− s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0;
385+ s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
386386 /* 16x16 motion prediction */
387387 mot_val= ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
388388 if (s->umvplus)
@@ -400,7 +400,7 @@ static void preview_obmc(MpegEncContext *s){ · 11 unmodified lines
400400 mot_val[1 ]= mot_val[3 ]=
401401 mot_val[1+stride]= mot_val[3+stride]= my;
402402 } else {
403− s->cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0;
403+ s->cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV;
404404 for(i=0;i<4;i++) {
405405 mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
406406 if (s->umvplus)
@@ -763,7 +763,7 @@ static int set_direct_mv(MpegEncContext *s) · 356 unmodified lines
763763 s->mv_type = MV_TYPE_8X8;
764764 for (i = 0; i < 4; i++)
765765 set_one_direct_mv(s, p, i);
766− return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
766+ return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_BIDIR_MV;
767767 } else {
768768 set_one_direct_mv(s, p, 0);
769769 s->mv[0][1][0] =
@@ -780,7 +780,7 @@ static int set_direct_mv(MpegEncContext *s) · 10 unmodified lines
780780 s->mv[1][3][1] = s->mv[1][0][1];
781781 s->mv_type = MV_TYPE_8X8;
782782 // Note see prev line
783− return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1;
783+ return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_BIDIR_MV;
784784 }
785785 }
786786
@@ -803,7 +803,7 @@ int ff_h263_decode_mb(MpegEncContext *s, · 16 unmodified lines
803803 s->block_last_index[i] = -1;
804804 s->mv_dir = MV_DIR_FORWARD;
805805 s->mv_type = MV_TYPE_16X16;
806− s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
806+ s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
807807 s->mv[0][0][0] = 0;
808808 s->mv[0][0][1] = 0;
809809 s->mb_skipped = !(s->obmc | s->loop_filter);
@@ -841,7 +841,7 @@ int ff_h263_decode_mb(MpegEncContext *s, · 31 unmodified lines
841841
842842 s->mv_dir = MV_DIR_FORWARD;
843843 if ((cbpc & 16) == 0) {
844− s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0;
844+ s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
845845 /* 16x16 motion prediction */
846846 s->mv_type = MV_TYPE_16X16;
847847 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
@@ -866,7 +866,7 @@ int ff_h263_decode_mb(MpegEncContext *s, · 18 unmodified lines
866866 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
867867 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
868868 } else {
869− s->cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0;
869+ s->cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV;
870870 s->mv_type = MV_TYPE_8X8;
871871 for(i=0;i<4;i++) {
872872 mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
@@ -952,7 +952,7 @@ int ff_h263_decode_mb(MpegEncContext *s, · 79 unmodified lines
952952 s->mv_type= MV_TYPE_16X16;
953953 //FIXME UMV
954954
955− if(USES_LIST(mb_type, 0)){
955+ if (HAS_FORWARD_MV(mb_type)) {
956956 int16_t *mot_val= ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
957957 s->mv_dir = MV_DIR_FORWARD;
958958
@@ -979,7 +979,7 @@ int ff_h263_decode_mb(MpegEncContext *s, · 20 unmodified lines
979979 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
980980 }
981981
982− if(USES_LIST(mb_type, 1)){
982+ if (HAS_BACKWARD_MV(mb_type)) {
983983 int16_t *mot_val= ff_h263_pred_motion(s, 0, 1, &pred_x, &pred_y);
984984 s->mv_dir |= MV_DIR_BACKWARD;
985985
libavcodec/ituh263enc.c+2−2
@@ -697,11 +697,11 @@ void ff_h263_update_mb(MpegEncContext *s) · 696 unmodified lines
697697 s->cur_pic.mbskip_table[mb_xy] = s->mb_skipped;
698698
699699 if (s->mv_type == MV_TYPE_8X8)
700− s->cur_pic.mb_type[mb_xy] = MB_TYPE_L0 | MB_TYPE_8x8;
700+ s->cur_pic.mb_type[mb_xy] = MB_TYPE_FORWARD_MV | MB_TYPE_8x8;
701701 else if(s->mb_intra)
702702 s->cur_pic.mb_type[mb_xy] = MB_TYPE_INTRA;
703703 else
704− s->cur_pic.mb_type[mb_xy] = MB_TYPE_L0 | MB_TYPE_16x16;
704+ s->cur_pic.mb_type[mb_xy] = MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
705705
706706 ff_h263_update_motion_val(s);
707707 }
libavcodec/mpeg12dec.c+22−22
@@ -97,26 +97,26 @@ typedef struct Mpeg1Context { · 96 unmodified lines
9797
9898 static const uint32_t ptype2mb_type[7] = {
9999 MB_TYPE_INTRA,
100− MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_ZERO_MV | MB_TYPE_16x16,
101− MB_TYPE_L0,
102− MB_TYPE_L0 | MB_TYPE_CBP,
100+ MB_TYPE_FORWARD_MV | MB_TYPE_CBP | MB_TYPE_ZERO_MV | MB_TYPE_16x16,
101+ MB_TYPE_FORWARD_MV,
102+ MB_TYPE_FORWARD_MV | MB_TYPE_CBP,
103103 MB_TYPE_QUANT | MB_TYPE_INTRA,
104− MB_TYPE_QUANT | MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_ZERO_MV | MB_TYPE_16x16,
105− MB_TYPE_QUANT | MB_TYPE_L0 | MB_TYPE_CBP,
104+ MB_TYPE_QUANT | MB_TYPE_FORWARD_MV | MB_TYPE_CBP | MB_TYPE_ZERO_MV | MB_TYPE_16x16,
105+ MB_TYPE_QUANT | MB_TYPE_FORWARD_MV | MB_TYPE_CBP,
106106 };
107107
108108 static const uint32_t btype2mb_type[11] = {
109109 MB_TYPE_INTRA,
110− MB_TYPE_L1,
111− MB_TYPE_L1 | MB_TYPE_CBP,
112− MB_TYPE_L0,
113− MB_TYPE_L0 | MB_TYPE_CBP,
114− MB_TYPE_L0L1,
115− MB_TYPE_L0L1 | MB_TYPE_CBP,
110+ MB_TYPE_BACKWARD_MV,
111+ MB_TYPE_BACKWARD_MV | MB_TYPE_CBP,
112+ MB_TYPE_FORWARD_MV,
113+ MB_TYPE_FORWARD_MV | MB_TYPE_CBP,
114+ MB_TYPE_BIDIR_MV,
115+ MB_TYPE_BIDIR_MV | MB_TYPE_CBP,
116116 MB_TYPE_QUANT | MB_TYPE_INTRA,
117− MB_TYPE_QUANT | MB_TYPE_L1 | MB_TYPE_CBP,
118− MB_TYPE_QUANT | MB_TYPE_L0 | MB_TYPE_CBP,
119− MB_TYPE_QUANT | MB_TYPE_L0L1 | MB_TYPE_CBP,
117+ MB_TYPE_QUANT | MB_TYPE_BACKWARD_MV | MB_TYPE_CBP,
118+ MB_TYPE_QUANT | MB_TYPE_FORWARD_MV | MB_TYPE_CBP,
119+ MB_TYPE_QUANT | MB_TYPE_BIDIR_MV | MB_TYPE_CBP,
120120 };
121121
122122 /* as H.263, but only 17 codes */
@@ -438,7 +438,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 315 unmodified lines
438438 if (s->pict_type == AV_PICTURE_TYPE_P) {
439439 s->mb_skipped = 1;
440440 s->cur_pic.mb_type[s->mb_x + s->mb_y * s->mb_stride] =
441− MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
441+ MB_TYPE_SKIP | MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
442442 } else {
443443 int mb_type;
444444
@@ -579,7 +579,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 134 unmodified lines
579579 s->mv[0][0][0] = 0;
580580 s->mv[0][0][1] = 0;
581581 } else {
582− av_assert2(mb_type & MB_TYPE_L0L1);
582+ av_assert2(mb_type & MB_TYPE_BIDIR_MV);
583583 // FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
584584 /* get additional motion vector type */
585585 if (s->picture_structure == PICT_FRAME && s->frame_pred_frame_dct) {
@@ -594,7 +594,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 8 unmodified lines
594594 s->qscale = mpeg_get_qscale(s);
595595
596596 /* motion vectors */
597− s->mv_dir = (mb_type >> 13) & 3;
597+ s->mv_dir = MB_TYPE_MV_2_MV_DIR(mb_type);
598598 ff_tlog(s->avctx, "motion_type=%d\n", motion_type);
599599 switch (motion_type) {
600600 case MT_FRAME: /* or MT_16X8 */
@@ -602,7 +602,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 1 unmodified line
602602 mb_type |= MB_TYPE_16x16;
603603 s->mv_type = MV_TYPE_16X16;
604604 for (i = 0; i < 2; i++) {
605− if (USES_LIST(mb_type, i)) {
605+ if (HAS_MV(mb_type, i)) {
606606 /* MT_FRAME */
607607 s->mv[i][0][0] =
608608 s->last_mv[i][0][0] =
@@ -625,7 +625,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 16 unmodified lines
625625 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
626626 s->mv_type = MV_TYPE_16X8;
627627 for (i = 0; i < 2; i++) {
628− if (USES_LIST(mb_type, i)) {
628+ if (HAS_MV(mb_type, i)) {
629629 /* MT_16X8 */
630630 for (j = 0; j < 2; j++) {
631631 s->field_select[i][j] = get_bits1(&s->gb);
@@ -645,7 +645,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 13 unmodified lines
645645 if (s->picture_structure == PICT_FRAME) {
646646 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
647647 for (i = 0; i < 2; i++) {
648− if (USES_LIST(mb_type, i)) {
648+ if (HAS_MV(mb_type, i)) {
649649 for (j = 0; j < 2; j++) {
650650 s->field_select[i][j] = get_bits1(&s->gb);
651651 val = mpeg_decode_motion(s, s->mpeg_f_code[i][0],
@@ -665,7 +665,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 13 unmodified lines
665665 av_assert0(!s->progressive_sequence);
666666 mb_type |= MB_TYPE_16x16 | MB_TYPE_INTERLACED;
667667 for (i = 0; i < 2; i++) {
668− if (USES_LIST(mb_type, i)) {
668+ if (HAS_MV(mb_type, i)) {
669669 s->field_select[i][0] = get_bits1(&s->gb);
670670 for (k = 0; k < 2; k++) {
671671 val = mpeg_decode_motion(s, s->mpeg_f_code[i][k],
@@ -685,7 +685,7 @@ static int mpeg_decode_mb(MpegEncContext *s, int16_t block[12][64]) · 13 unmodified lines
685685 }
686686 s->mv_type = MV_TYPE_DMV;
687687 for (i = 0; i < 2; i++) {
688− if (USES_LIST(mb_type, i)) {
688+ if (HAS_MV(mb_type, i)) {
689689 int dmx, dmy, mx, my, m;
690690 const int my_shift = s->picture_structure == PICT_FRAME;
691691
libavcodec/mpeg4video.c+3−3
@@ -141,7 +141,7 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my) · 140 unmodified lines
141141 s->mv_type = MV_TYPE_8X8;
142142 for (i = 0; i < 4; i++)
143143 ff_mpeg4_set_one_direct_mv(s, mx, my, i);
144− return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_L0L1;
144+ return MB_TYPE_DIRECT2 | MB_TYPE_8x8 | MB_TYPE_BIDIR_MV;
145145 } else if (IS_INTERLACED(colocated_mb_type)) {
146146 s->mv_type = MV_TYPE_FIELD;
147147 for (i = 0; i < 2; i++) {
@@ -169,7 +169,7 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my) · 21 unmodified lines
169169 (time_pb - time_pp) / time_pp;
170170 }
171171 return MB_TYPE_DIRECT2 | MB_TYPE_16x8 |
172− MB_TYPE_L0L1 | MB_TYPE_INTERLACED;
172+ MB_TYPE_BIDIR_MV | MB_TYPE_INTERLACED;
173173 } else {
174174 ff_mpeg4_set_one_direct_mv(s, mx, my, 0);
175175 s->mv[0][1][0] =
@@ -190,6 +190,6 @@ int ff_mpeg4_set_direct_mv(MpegEncContext *s, int mx, int my) · 14 unmodified lines
190190 else
191191 s->mv_type = MV_TYPE_8X8;
192192 // Note see prev line
193− return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_L0L1;
193+ return MB_TYPE_DIRECT2 | MB_TYPE_16x16 | MB_TYPE_BIDIR_MV;
194194 }
195195 }
libavcodec/mpeg4videodec.c+25−28
@@ -68,10 +68,10 @@ static VLCElem studio_chroma_dc[528]; · 67 unmodified lines
6868 static const uint8_t mpeg4_block_count[4] = { 0, 6, 8, 12 };
6969
7070 static const int mb_type_b_map[4] = {
71− MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
72− MB_TYPE_L0L1 | MB_TYPE_16x16,
73− MB_TYPE_L1 | MB_TYPE_16x16,
74− MB_TYPE_L0 | MB_TYPE_16x16,
71+ MB_TYPE_DIRECT2 | MB_TYPE_BIDIR_MV,
72+ MB_TYPE_BIDIR_MV | MB_TYPE_16x16,
73+ MB_TYPE_BACKWARD_MV | MB_TYPE_16x16,
74+ MB_TYPE_FORWARD_MV | MB_TYPE_16x16,
7575 };
7676
7777 static void gmc1_motion(MpegEncContext *s, const Mpeg4DecContext *ctx,
@@ -1010,13 +1010,13 @@ try_again: · 932 unmodified lines
10101010 s->cur_pic.mb_type[xy] = MB_TYPE_SKIP |
10111011 MB_TYPE_16x16 |
10121012 MB_TYPE_GMC |
1013− MB_TYPE_L0;
1013+ MB_TYPE_FORWARD_MV;
10141014 mx = get_amv(ctx, 0);
10151015 my = get_amv(ctx, 1);
10161016 } else {
10171017 s->cur_pic.mb_type[xy] = MB_TYPE_SKIP |
10181018 MB_TYPE_16x16 |
1019− MB_TYPE_L0;
1019+ MB_TYPE_FORWARD_MV;
10201020 mx = my = 0;
10211021 }
10221022 mot_val[0] =
@@ -1081,13 +1081,13 @@ try_again: · 58 unmodified lines
10811081 if (my >= 0xffff)
10821082 return AVERROR_INVALIDDATA;
10831083 s->cur_pic.mb_type[xy] = MB_TYPE_16x16 |
1084− MB_TYPE_L0;
1084+ MB_TYPE_FORWARD_MV;
10851085 } else {
10861086 mx = get_amv(ctx, 0);
10871087 my = get_amv(ctx, 1);
10881088 s->cur_pic.mb_type[xy] = MB_TYPE_16x16 |
10891089 MB_TYPE_GMC |
1090− MB_TYPE_L0;
1090+ MB_TYPE_FORWARD_MV;
10911091 }
10921092
10931093 mot_val[0] =
@@ -1101,7 +1101,7 @@ try_again: · 7 unmodified lines
11011101 } else {
11021102 int i;
11031103 s->cur_pic.mb_type[xy] = MB_TYPE_8x8 |
1104− MB_TYPE_L0;
1104+ MB_TYPE_FORWARD_MV;
11051105 for (i = 0; i < 4; i++) {
11061106 int16_t *mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
11071107 mx = ff_h263_decode_motion(s, pred_x, s->f_code);
@@ -1675,16 +1675,15 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 567 unmodified lines
16751675 s->cur_pic.mb_type[xy] = MB_TYPE_SKIP |
16761676 MB_TYPE_GMC |
16771677 MB_TYPE_16x16 |
1678− MB_TYPE_L0;
1678+ MB_TYPE_FORWARD_MV;
16791679 s->mcsel = 1;
16801680 s->mv[0][0][0] = get_amv(ctx, 0);
16811681 s->mv[0][0][1] = get_amv(ctx, 1);
16821682 s->cur_pic.mbskip_table[xy] = 0;
16831683 s->mb_skipped = 0;
16841684 } else {
1685− s->cur_pic.mb_type[xy] = MB_TYPE_SKIP |
1686− MB_TYPE_16x16 |
1687− MB_TYPE_L0;
1685+ s->cur_pic.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 |
1686+ MB_TYPE_FORWARD_MV;
16881687 s->mcsel = 0;
16891688 s->mv[0][0][0] = 0;
16901689 s->mv[0][0][1] = 0;
@@ -1729,9 +1728,8 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 38 unmodified lines
17291728 s->mv_dir = MV_DIR_FORWARD;
17301729 if ((cbpc & 16) == 0) {
17311730 if (s->mcsel) {
1732− s->cur_pic.mb_type[xy] = MB_TYPE_GMC |
1733− MB_TYPE_16x16 |
1734− MB_TYPE_L0;
1731+ s->cur_pic.mb_type[xy] = MB_TYPE_GMC | MB_TYPE_16x16 |
1732+ MB_TYPE_FORWARD_MV;
17351733 /* 16x16 global motion prediction */
17361734 s->mv_type = MV_TYPE_16X16;
17371735 mx = get_amv(ctx, 0);
@@ -1739,8 +1737,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 1 unmodified line
17391737 s->mv[0][0][0] = mx;
17401738 s->mv[0][0][1] = my;
17411739 } else if ((!s->progressive_sequence) && get_bits1(&s->gb)) {
1742− s->cur_pic.mb_type[xy] = MB_TYPE_16x8 |
1743− MB_TYPE_L0 |
1740+ s->cur_pic.mb_type[xy] = MB_TYPE_16x8 | MB_TYPE_FORWARD_MV |
17441741 MB_TYPE_INTERLACED;
17451742 /* 16x8 field motion prediction */
17461743 s->mv_type = MV_TYPE_FIELD;
@@ -1763,7 +1760,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 16 unmodified lines
17631760 s->mv[0][i][1] = my;
17641761 }
17651762 } else {
1766− s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0;
1763+ s->cur_pic.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
17671764 /* 16x16 motion prediction */
17681765 s->mv_type = MV_TYPE_16X16;
17691766 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
@@ -1780,7 +1777,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 10 unmodified lines
17801777 s->mv[0][0][1] = my;
17811778 }
17821779 } else {
1783− s->cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0;
1780+ s->cur_pic.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_FORWARD_MV;
17841781 s->mv_type = MV_TYPE_8X8;
17851782 for (i = 0; i < 4; i++) {
17861783 int16_t *mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
@@ -1832,14 +1829,14 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 45 unmodified lines
18321829 s->mv[1][0][1] = 0;
18331830 s->cur_pic.mb_type[xy] = MB_TYPE_SKIP |
18341831 MB_TYPE_16x16 |
1835− MB_TYPE_L0;
1832+ MB_TYPE_FORWARD_MV;
18361833 goto end;
18371834 }
18381835
18391836 modb1 = get_bits1(&s->gb);
18401837 if (modb1) {
18411838 // like MB_TYPE_B_DIRECT but no vectors coded
1842− mb_type = MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_L0L1;
1839+ mb_type = MB_TYPE_DIRECT2 | MB_TYPE_SKIP | MB_TYPE_BIDIR_MV;
18431840 cbp = 0;
18441841 } else {
18451842 modb2 = get_bits1(&s->gb);
@@ -1869,11 +1866,11 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 23 unmodified lines
18691866 mb_type |= MB_TYPE_16x8 | MB_TYPE_INTERLACED;
18701867 mb_type &= ~MB_TYPE_16x16;
18711868
1872− if (USES_LIST(mb_type, 0)) {
1869+ if (HAS_FORWARD_MV(mb_type)) {
18731870 s->field_select[0][0] = get_bits1(&s->gb);
18741871 s->field_select[0][1] = get_bits1(&s->gb);
18751872 }
1876− if (USES_LIST(mb_type, 1)) {
1873+ if (HAS_BACKWARD_MV(mb_type)) {
18771874 s->field_select[1][0] = get_bits1(&s->gb);
18781875 s->field_select[1][1] = get_bits1(&s->gb);
18791876 }
@@ -1884,7 +1881,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 4 unmodified lines
18841881 if ((mb_type & (MB_TYPE_DIRECT2 | MB_TYPE_INTERLACED)) == 0) {
18851882 s->mv_type = MV_TYPE_16X16;
18861883
1887− if (USES_LIST(mb_type, 0)) {
1884+ if (HAS_FORWARD_MV(mb_type)) {
18881885 s->mv_dir = MV_DIR_FORWARD;
18891886
18901887 mx = ff_h263_decode_motion(s, s->last_mv[0][0][0], s->f_code);
@@ -1897,7 +1894,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 6 unmodified lines
18971894 s->mv[0][0][1] = my;
18981895 }
18991896
1900− if (USES_LIST(mb_type, 1)) {
1897+ if (HAS_BACKWARD_MV(mb_type)) {
19011898 s->mv_dir |= MV_DIR_BACKWARD;
19021899
19031900 mx = ff_h263_decode_motion(s, s->last_mv[1][0][0], s->b_code);
@@ -1912,7 +1909,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 8 unmodified lines
19121909 } else if (!IS_DIRECT(mb_type)) {
19131910 s->mv_type = MV_TYPE_FIELD;
19141911
1915− if (USES_LIST(mb_type, 0)) {
1912+ if (HAS_FORWARD_MV(mb_type)) {
19161913 s->mv_dir = MV_DIR_FORWARD;
19171914
19181915 for (i = 0; i < 2; i++) {
@@ -1924,7 +1921,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 5 unmodified lines
19241921 }
19251922 }
19261923
1927− if (USES_LIST(mb_type, 1)) {
1924+ if (HAS_BACKWARD_MV(mb_type)) {
19281925 s->mv_dir |= MV_DIR_BACKWARD;
19291926
19301927 for (i = 0; i < 2; i++) {
libavcodec/mpegutils.c+14−9
@@ -104,7 +104,9 @@ void ff_draw_horiz_band(AVCodecContext *avctx, · 103 unmodified lines
104104 y, picture_structure, h);
105105 }
106106
107−static char get_type_mv_char(int mb_type)
107+#define HAS_MV_EXT(mb_type, flags, dir) ((mb_type) & flags[(dir)])
108+
109+static char get_type_mv_char(int mb_type, const int mb_type_mv_flags[2])
108110 {
109111 // Type & MV direction
110112 if (IS_PCM(mb_type))
@@ -125,12 +127,12 @@ static char get_type_mv_char(int mb_type) · 14 unmodified lines
125127 return 'G';
126128 else if (IS_SKIP(mb_type))
127129 return 'S';
128− else if (!USES_LIST(mb_type, 1))
130+ else if (!HAS_MV_EXT(mb_type, 1, mb_type_mv_flags))
129131 return '>';
130− else if (!USES_LIST(mb_type, 0))
132+ else if (!HAS_MV_EXT(mb_type, 0, mb_type_mv_flags))
131133 return '<';
132134 else {
133− av_assert2(USES_LIST(mb_type, 0) && USES_LIST(mb_type, 1));
135+ av_assert2(HAS_MV_EXT(mb_type, 0, mb_type_mv_flags) && HAS_MV_EXT(mb_type, 1, mb_type_mv_flags));
134136 return 'X';
135137 }
136138 }
@@ -162,12 +164,15 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, · 25 unmodified lines
162164 const int8_t *qscale_table, int16_t (*const motion_val[2])[2],
163165 int mb_width, int mb_height, int mb_stride, int quarter_sample)
164166 {
167+ const int is_h264 = avctx->codec_id == AV_CODEC_ID_H264;
168+ const int mb_type_mv_flags[2] = { is_h264 ? MB_TYPE_L0 : MB_TYPE_FORWARD_MV,
169+ is_h264 ? MB_TYPE_L1 : MB_TYPE_BACKWARD_MV };
170+
165171 if ((avctx->export_side_data & AV_CODEC_EXPORT_DATA_MVS) && mbtype_table && motion_val[0]) {
166172 const int shift = 1 + quarter_sample;
167173 const int scale = 1 << shift;
168− const int mv_sample_log2 = avctx->codec_id == AV_CODEC_ID_H264 ? 2 : 1;
169− const int mv_stride = (mb_width << mv_sample_log2) +
170− (avctx->codec->id == AV_CODEC_ID_H264 ? 0 : 1);
174+ const int mv_sample_log2 = is_h264 ? 2 : 1;
175+ const int mv_stride = (mb_width << mv_sample_log2) + !is_h264;
171176 int mb_x, mb_y, mbcount = 0;
172177
173178 /* size is width * height * 2 * 4 where 2 is for directions and 4 is
@@ -180,7 +185,7 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, · 6 unmodified lines
180185 for (mb_x = 0; mb_x < mb_width; mb_x++) {
181186 int i, direction, mb_type = mbtype_table[mb_x + mb_y * mb_stride];
182187 for (direction = 0; direction < 2; direction++) {
183− if (!USES_LIST(mb_type, direction))
188+ if (!HAS_MV_EXT(mb_type, direction, mb_type_mv_flags))
184189 continue;
185190 if (IS_8X8(mb_type)) {
186191 for (i = 0; i < 4; i++) {
@@ -299,7 +304,7 @@ void ff_print_debug_info2(AVCodecContext *avctx, AVFrame *pict, · 112 unmodified lines
299304 int mb_type = mbtype_table[x + y * mb_stride];
300305
301306 av_bprintf(&buf, "%c%c%c",
302− get_type_mv_char(mb_type),
307+ get_type_mv_char(mb_type, mb_type_mv_flags),
303308 get_segmentation_char(mb_type),
304309 get_interlacement_char(mb_type));
305310 }
libavcodec/mpegutils.h+10−0
@@ -47,6 +47,10 @@ · 46 unmodified lines
4747 #define MB_TYPE_DIRECT2 (1 << 8) // FIXME
4848 #define MB_TYPE_CBP (1 << 10)
4949 #define MB_TYPE_QUANT (1 << 11)
50+#define MB_TYPE_FORWARD_MV (1 << 12)
51+#define MB_TYPE_BACKWARD_MV (1 << 13)
52+#define MB_TYPE_BIDIR_MV (MB_TYPE_FORWARD_MV | MB_TYPE_BACKWARD_MV)
53+// MB_TYPE_P[01]L[01], MB_TYPE_L[01] and MB_TYPE_L0L1 are H.264 only.
5054 #define MB_TYPE_P0L0 (1 << 12)
5155 #define MB_TYPE_P1L0 (1 << 13)
5256 #define MB_TYPE_P0L1 (1 << 14)
@@ -90,6 +94,12 @@ · 37 unmodified lines
9094 #define USES_LIST(a, list) ((a) & ((MB_TYPE_P0L0 | MB_TYPE_P1L0) << (2 * (list))))
9195
9296 #define HAS_CBP(a) ((a) & MB_TYPE_CBP)
97+#define HAS_FORWARD_MV(a) ((a) & MB_TYPE_FORWARD_MV)
98+#define HAS_BACKWARD_MV(a) ((a) & MB_TYPE_BACKWARD_MV)
99+// dir == 0 means forward, dir == 1 is backward
100+#define HAS_MV(a, dir) ((a) & (MB_TYPE_FORWARD_MV << (dir)))
101+
102+#define MB_TYPE_MV_2_MV_DIR(a) (((a) >> 12) & (MV_DIR_FORWARD | MV_DIR_BACKWARD))
93103
94104 /**
95105 * Draw a horizontal band if supported.
libavcodec/msmpeg4dec.c+4−4
@@ -120,7 +120,7 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 119 unmodified lines
120120 s->mv[0][0][0] = 0;
121121 s->mv[0][0][1] = 0;
122122 s->mb_skipped = 1;
123− *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
123+ *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
124124 return 0;
125125 }
126126 }
@@ -170,7 +170,7 @@ static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 43 unmodified lines
170170 s->mv_type = MV_TYPE_16X16;
171171 s->mv[0][0][0] = mx;
172172 s->mv[0][0][1] = my;
173− *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
173+ *mb_type_ptr = MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
174174 } else {
175175 int v;
176176 if (s->msmpeg4_version == MSMP4_V2) {
@@ -226,7 +226,7 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 49 unmodified lines
226226 s->mv[0][0][0] = 0;
227227 s->mv[0][0][1] = 0;
228228 s->mb_skipped = 1;
229− *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
229+ *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
230230
231231 return 0;
232232 }
@@ -265,7 +265,7 @@ static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64]) · 32 unmodified lines
265265 s->mv_type = MV_TYPE_16X16;
266266 s->mv[0][0][0] = mx;
267267 s->mv[0][0][1] = my;
268− *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
268+ *mb_type_ptr = MB_TYPE_FORWARD_MV | MB_TYPE_16x16;
269269 } else {
270270 ff_dlog(s, "I at %d %d %d %06X\n", s->mb_x, s->mb_y,
271271 ((cbp & 3) ? 1 : 0) +((cbp & 0x3C)? 2 : 0),
libavcodec/rv34.c+9−9
@@ -59,16 +59,16 @@ static inline void ZERO8x2(void* dst, int stride) · 58 unmodified lines
5959 static const int rv34_mb_type_to_lavc[12] = {
6060 MB_TYPE_INTRA,
6161 MB_TYPE_INTRA16x16 | MB_TYPE_SEPARATE_DC,
62− MB_TYPE_16x16 | MB_TYPE_L0,
63− MB_TYPE_8x8 | MB_TYPE_L0,
64− MB_TYPE_16x16 | MB_TYPE_L0,
65− MB_TYPE_16x16 | MB_TYPE_L1,
62+ MB_TYPE_16x16 | MB_TYPE_FORWARD_MV,
63+ MB_TYPE_8x8 | MB_TYPE_FORWARD_MV,
64+ MB_TYPE_16x16 | MB_TYPE_FORWARD_MV,
65+ MB_TYPE_16x16 | MB_TYPE_BACKWARD_MV,
6666 MB_TYPE_SKIP,
6767 MB_TYPE_DIRECT2 | MB_TYPE_16x16,
68− MB_TYPE_16x8 | MB_TYPE_L0,
69− MB_TYPE_8x16 | MB_TYPE_L0,
70− MB_TYPE_16x16 | MB_TYPE_L0L1,
71− MB_TYPE_16x16 | MB_TYPE_L0 | MB_TYPE_SEPARATE_DC
68+ MB_TYPE_16x8 | MB_TYPE_FORWARD_MV,
69+ MB_TYPE_8x16 | MB_TYPE_FORWARD_MV,
70+ MB_TYPE_16x16 | MB_TYPE_BIDIR_MV,
71+ MB_TYPE_16x16 | MB_TYPE_FORWARD_MV | MB_TYPE_SEPARATE_DC
7272 };
7373
7474
@@ -568,7 +568,7 @@ static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir) · 493 unmodified lines
568568 int mx, my;
569569 int i, j;
570570 MPVWorkPicture *cur_pic = &s->cur_pic;
571− const int mask = dir ? MB_TYPE_L1 : MB_TYPE_L0;
571+ const int mask = dir ? MB_TYPE_BACKWARD_MV : MB_TYPE_FORWARD_MV;
572572 int type = cur_pic->mb_type[mb_pos];
573573
574574 if((r->avail_cache[6-1] & type) & mask){
libavcodec/wmv2dec.c+6−6
@@ -112,7 +112,7 @@ static int parse_mb_skip(WMV2DecContext *w) · 111 unmodified lines
112112 for (mb_y = 0; mb_y < s->mb_height; mb_y++)
113113 for (mb_x = 0; mb_x < s->mb_width; mb_x++)
114114 mb_type[mb_y * s->mb_stride + mb_x] =
115− MB_TYPE_16x16 | MB_TYPE_L0;
115+ MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
116116 break;
117117 case SKIP_TYPE_MPEG:
118118 if (get_bits_left(&s->gb) < s->mb_height * s->mb_width)
@@ -120,7 +120,7 @@ static int parse_mb_skip(WMV2DecContext *w) · 1 unmodified line
120120 for (mb_y = 0; mb_y < s->mb_height; mb_y++)
121121 for (mb_x = 0; mb_x < s->mb_width; mb_x++)
122122 mb_type[mb_y * s->mb_stride + mb_x] =
123− (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0;
123+ (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
124124 break;
125125 case SKIP_TYPE_ROW:
126126 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
@@ -129,11 +129,11 @@ static int parse_mb_skip(WMV2DecContext *w) · 2 unmodified lines
129129 if (get_bits1(&s->gb)) {
130130 for (mb_x = 0; mb_x < s->mb_width; mb_x++)
131131 mb_type[mb_y * s->mb_stride + mb_x] =
132− MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
132+ MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
133133 } else {
134134 for (mb_x = 0; mb_x < s->mb_width; mb_x++)
135135 mb_type[mb_y * s->mb_stride + mb_x] =
136− (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0;
136+ (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
137137 }
138138 }
139139 break;
@@ -144,11 +144,11 @@ static int parse_mb_skip(WMV2DecContext *w) · 4 unmodified lines
144144 if (get_bits1(&s->gb)) {
145145 for (mb_y = 0; mb_y < s->mb_height; mb_y++)
146146 mb_type[mb_y * s->mb_stride + mb_x] =
147− MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
147+ MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
148148 } else {
149149 for (mb_y = 0; mb_y < s->mb_height; mb_y++)
150150 mb_type[mb_y * s->mb_stride + mb_x] =
151− (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0;
151+ (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_FORWARD_MV;
152152 }
153153 }
154154 break;

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