summaryrefslogtreecommitdiff
path: root/libavcodec/h264_sei.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-12-09 21:53:23 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-12-09 21:53:23 +0100
commitbe6e81463c72dda837d62ef0a7c26f35a666d1d3 (patch)
tree54e21d585a93dfb9d1adf47c5c4d2513154b043c /libavcodec/h264_sei.c
parent7a6034805305cb5d6a3d755d774f0ad09119049e (diff)
parent5b10ef729f610fcbc9c485e7b643ce53268144cb (diff)
Merge commit '5b10ef729f610fcbc9c485e7b643ce53268144cb'
* commit '5b10ef729f610fcbc9c485e7b643ce53268144cb': h264: parse frame packing arrangement SEI messages and save relevant stereo3d information Conflicts: libavcodec/h264.c libavcodec/h264_sei.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h264_sei.c')
-rw-r--r--libavcodec/h264_sei.c59
1 files changed, 35 insertions, 24 deletions
diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c
index 7d5558acb3..a4867290ba 100644
--- a/libavcodec/h264_sei.c
+++ b/libavcodec/h264_sei.c
@@ -42,6 +42,7 @@ void ff_h264_reset_sei(H264Context *h)
h->sei_dpb_output_delay = 0;
h->sei_cpb_removal_delay = -1;
h->sei_buffering_period_present = 0;
+ h->sei_frame_packing_present = 0;
}
static int decode_picture_timing(H264Context *h)
@@ -223,31 +224,40 @@ static int decode_buffering_period(H264Context *h)
return 0;
}
-static int decode_frame_packing(H264Context *h, int size) {
- int bits = get_bits_left(&h->gb);
+static int decode_frame_packing_arrangement(H264Context *h)
+{
+ int cancel;
+ int quincunx = 0;
+ int content = -1;
+ int type = -1;
h->sei_fpa.frame_packing_arrangement_id = get_ue_golomb(&h->gb);
- h->sei_fpa.frame_packing_arrangement_cancel_flag = get_bits(&h->gb, 1);
- if (!h->sei_fpa.frame_packing_arrangement_cancel_flag) {
- h->sei_fpa.frame_packing_arrangement_type = get_bits(&h->gb, 7);
- h->sei_fpa.quincunx_sampling_flag = get_bits(&h->gb, 1);
- h->sei_fpa.content_interpretation_type = get_bits(&h->gb, 6);
- skip_bits(&h->gb, 1); /* spatial_flipping_flag */
- skip_bits(&h->gb, 1); /* frame0_flipped_flag */
- skip_bits(&h->gb, 1); /* field_views_flag */
- skip_bits(&h->gb, 1); /* current_frame_is_frame0_flag */
- skip_bits(&h->gb, 1); /* frame0_self_contained_flag */
- skip_bits(&h->gb, 1); /* frame1_self_contained_flag */
- if (!h->sei_fpa.quincunx_sampling_flag && h->sei_fpa.frame_packing_arrangement_type != 5) {
- skip_bits(&h->gb, 4); /* frame0_grid_position_x */
- skip_bits(&h->gb, 4); /* frame0_grid_position_y */
- skip_bits(&h->gb, 4); /* frame1_grid_position_x */
- skip_bits(&h->gb, 4); /* frame1_grid_position_y */
- }
- skip_bits(&h->gb, 8); /* frame_packing_arrangement_reserved_byte */
+ cancel = get_bits(&h->gb, 1);
+ if (cancel == 0) {
+ type = get_bits(&h->gb, 7); // frame_packing_arrangement_type
+ quincunx = get_bits1(&h->gb); // quincunx_sampling_flag
+ content = get_bits(&h->gb, 6); // content_interpretation_type
+
+ // the following skips: spatial_flipping_flag, frame0_flipped_flag,
+ // field_views_flag, current_frame_is_frame0_flag,
+ // frame0_self_contained_flag, frame1_self_contained_flag
+ skip_bits(&h->gb, 6);
+ if (quincunx == 0 && type != 5)
+ skip_bits(&h->gb, 16); // frame[01]_grid_position_[xy]
+ skip_bits(&h->gb, 8); // frame_packing_arrangement_reserved_byte
h->sei_fpa.frame_packing_arrangement_repetition_period = get_ue_golomb(&h->gb) /* frame_packing_arrangement_repetition_period */;
}
- skip_bits(&h->gb, 1); /* frame_packing_arrangement_extension_flag */
+ skip_bits1(&h->gb); // frame_packing_arrangement_extension_flag
+
+ h->sei_frame_packing_present = (cancel == 0);
+ h->frame_packing_arrangement_type = type;
+ h->content_interpretation_type = content;
+ h->quincunx_subsampling = quincunx;
+
+ h->sei_fpa.frame_packing_arrangement_cancel_flag = cancel ;
+ h->sei_fpa.frame_packing_arrangement_type = type ;
+ h->sei_fpa.quincunx_sampling_flag = quincunx;
+ h->sei_fpa.content_interpretation_type = content ;
if (h->avctx->debug & FF_DEBUG_PICT_INFO)
av_log(h->avctx, AV_LOG_DEBUG, "SEI FPA %d %d %d %d %d %d\n",
@@ -257,7 +267,7 @@ static int decode_frame_packing(H264Context *h, int size) {
h->sei_fpa.quincunx_sampling_flag,
h->sei_fpa.content_interpretation_type,
h->sei_fpa.frame_packing_arrangement_repetition_period);
- skip_bits_long(&h->gb, 8 * size - (bits - get_bits_left(&h->gb)));
+
return 0;
}
@@ -317,8 +327,9 @@ int ff_h264_decode_sei(H264Context *h)
return ret;
break;
case SEI_TYPE_FRAME_PACKING:
- if (decode_frame_packing(h, size) < 0)
- return -1;
+ ret = decode_frame_packing_arrangement(h);
+ if (ret < 0)
+ return ret;
break;
default:
av_log(h->avctx, AV_LOG_DEBUG, "unknown SEI type %d\n", type);