u32 length;             // Length of this frame
                u32 offset_low;         // Offset in the file of the
                u32 offset_high;        // start of this frame
-               u32 mask1;              // Bits 0-1 are the type mask:
+               u32 mask1;              // Bits 0-2 are the type mask:
                                        // 1=I, 2=P, 4=B
+                                       // 0=End of Program Index, other fields
+                                       //   are invalid.
                u32 pts;                // The PTS of the frame
                u32 mask2;              // Bit 0 is bit 32 of the pts.
        };
 
                int idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num;
                struct v4l2_enc_idx_entry *e = itv->pgm_info + idx;
                u32 addr = itv->pgm_info_offset + 4 + idx * 24;
-               const int mapping[] = { V4L2_ENC_IDX_FRAME_P, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_B, 0 };
+               const int mapping[8] = { -1, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_P, -1,
+                       V4L2_ENC_IDX_FRAME_B, -1, -1, -1 };
+                                       // 1=I, 2=P, 4=B
 
                e->offset = read_enc(addr + 4) + ((u64)read_enc(addr + 8) << 32);
                if (e->offset > itv->mpg_data_received) {
                e->offset += itv->vbi_data_inserted;
                e->length = read_enc(addr);
                e->pts = read_enc(addr + 16) + ((u64)(read_enc(addr + 20) & 1) << 32);
-               e->flags = mapping[read_enc(addr + 12) & 3];
+               e->flags = mapping[read_enc(addr + 12) & 7];
                i++;
        }
        itv->pgm_info_write_idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num;
 
 
        case VIDIOC_G_ENC_INDEX: {
                struct v4l2_enc_idx *idx = arg;
+               struct v4l2_enc_idx_entry *e = idx->entry;
+               int entries;
                int i;
 
-               idx->entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
+               entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
                                        IVTV_MAX_PGM_INDEX;
-               if (idx->entries > V4L2_ENC_IDX_ENTRIES)
-                       idx->entries = V4L2_ENC_IDX_ENTRIES;
-               for (i = 0; i < idx->entries; i++) {
-                       idx->entry[i] = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
+               if (entries > V4L2_ENC_IDX_ENTRIES)
+                       entries = V4L2_ENC_IDX_ENTRIES;
+               idx->entries = 0;
+               for (i = 0; i < entries; i++) {
+                       *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
+                       if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
+                               idx->entries++;
+                               e++;
+                       }
                }
                itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
                break;