diff options
-rw-r--r-- | Documentation/video4linux/cx2341x/fw-encoder-api.txt | 4 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-fileops.c | 6 | ||||
-rw-r--r-- | drivers/media/video/ivtv/ivtv-ioctl.c | 17 |
3 files changed, 19 insertions, 8 deletions
diff --git a/Documentation/video4linux/cx2341x/fw-encoder-api.txt b/Documentation/video4linux/cx2341x/fw-encoder-api.txt index 5dd3109a8b3f..5a27af2ee1c6 100644 --- a/Documentation/video4linux/cx2341x/fw-encoder-api.txt +++ b/Documentation/video4linux/cx2341x/fw-encoder-api.txt | |||
@@ -407,8 +407,10 @@ Description | |||
407 | u32 length; // Length of this frame | 407 | u32 length; // Length of this frame |
408 | u32 offset_low; // Offset in the file of the | 408 | u32 offset_low; // Offset in the file of the |
409 | u32 offset_high; // start of this frame | 409 | u32 offset_high; // start of this frame |
410 | u32 mask1; // Bits 0-1 are the type mask: | 410 | u32 mask1; // Bits 0-2 are the type mask: |
411 | // 1=I, 2=P, 4=B | 411 | // 1=I, 2=P, 4=B |
412 | // 0=End of Program Index, other fields | ||
413 | // are invalid. | ||
412 | u32 pts; // The PTS of the frame | 414 | u32 pts; // The PTS of the frame |
413 | u32 mask2; // Bit 0 is bit 32 of the pts. | 415 | u32 mask2; // Bit 0 is bit 32 of the pts. |
414 | }; | 416 | }; |
diff --git a/drivers/media/video/ivtv/ivtv-fileops.c b/drivers/media/video/ivtv/ivtv-fileops.c index 5dd519caf81d..0285c4a830eb 100644 --- a/drivers/media/video/ivtv/ivtv-fileops.c +++ b/drivers/media/video/ivtv/ivtv-fileops.c | |||
@@ -190,7 +190,9 @@ static void ivtv_update_pgm_info(struct ivtv *itv) | |||
190 | int idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num; | 190 | int idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num; |
191 | struct v4l2_enc_idx_entry *e = itv->pgm_info + idx; | 191 | struct v4l2_enc_idx_entry *e = itv->pgm_info + idx; |
192 | u32 addr = itv->pgm_info_offset + 4 + idx * 24; | 192 | u32 addr = itv->pgm_info_offset + 4 + idx * 24; |
193 | const int mapping[] = { V4L2_ENC_IDX_FRAME_P, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_B, 0 }; | 193 | const int mapping[8] = { -1, V4L2_ENC_IDX_FRAME_I, V4L2_ENC_IDX_FRAME_P, -1, |
194 | V4L2_ENC_IDX_FRAME_B, -1, -1, -1 }; | ||
195 | // 1=I, 2=P, 4=B | ||
194 | 196 | ||
195 | e->offset = read_enc(addr + 4) + ((u64)read_enc(addr + 8) << 32); | 197 | e->offset = read_enc(addr + 4) + ((u64)read_enc(addr + 8) << 32); |
196 | if (e->offset > itv->mpg_data_received) { | 198 | if (e->offset > itv->mpg_data_received) { |
@@ -199,7 +201,7 @@ static void ivtv_update_pgm_info(struct ivtv *itv) | |||
199 | e->offset += itv->vbi_data_inserted; | 201 | e->offset += itv->vbi_data_inserted; |
200 | e->length = read_enc(addr); | 202 | e->length = read_enc(addr); |
201 | e->pts = read_enc(addr + 16) + ((u64)(read_enc(addr + 20) & 1) << 32); | 203 | e->pts = read_enc(addr + 16) + ((u64)(read_enc(addr + 20) & 1) << 32); |
202 | e->flags = mapping[read_enc(addr + 12) & 3]; | 204 | e->flags = mapping[read_enc(addr + 12) & 7]; |
203 | i++; | 205 | i++; |
204 | } | 206 | } |
205 | itv->pgm_info_write_idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num; | 207 | itv->pgm_info_write_idx = (itv->pgm_info_write_idx + i) % itv->pgm_info_num; |
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c index 5977a79619c2..dfe0aedc60fd 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.c +++ b/drivers/media/video/ivtv/ivtv-ioctl.c | |||
@@ -1099,14 +1099,21 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void | |||
1099 | 1099 | ||
1100 | case VIDIOC_G_ENC_INDEX: { | 1100 | case VIDIOC_G_ENC_INDEX: { |
1101 | struct v4l2_enc_idx *idx = arg; | 1101 | struct v4l2_enc_idx *idx = arg; |
1102 | struct v4l2_enc_idx_entry *e = idx->entry; | ||
1103 | int entries; | ||
1102 | int i; | 1104 | int i; |
1103 | 1105 | ||
1104 | idx->entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) % | 1106 | entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) % |
1105 | IVTV_MAX_PGM_INDEX; | 1107 | IVTV_MAX_PGM_INDEX; |
1106 | if (idx->entries > V4L2_ENC_IDX_ENTRIES) | 1108 | if (entries > V4L2_ENC_IDX_ENTRIES) |
1107 | idx->entries = V4L2_ENC_IDX_ENTRIES; | 1109 | entries = V4L2_ENC_IDX_ENTRIES; |
1108 | for (i = 0; i < idx->entries; i++) { | 1110 | idx->entries = 0; |
1109 | idx->entry[i] = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX]; | 1111 | for (i = 0; i < entries; i++) { |
1112 | *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX]; | ||
1113 | if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) { | ||
1114 | idx->entries++; | ||
1115 | e++; | ||
1116 | } | ||
1110 | } | 1117 | } |
1111 | itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX; | 1118 | itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX; |
1112 | break; | 1119 | break; |