From 92fdb43dd47fbc3368d9d9c7ad940fbe03657bd3 Mon Sep 17 00:00:00 2001 From: Tal Aloni Date: Tue, 17 Jun 2014 15:10:56 -0700 Subject: [PATCH] Fix frame-packing==5 with some decoders The spec mandates that frame-packing==5 requires the SEI on every frame that begins a view sequence (i.e. the input frames L0-R0-L1-R1 have 4 view sequences, but if reordered by the encoder to L0-L1-R0-R1 there are now 2 view sequences). For simplicity, we write the SEI on every frame. This fixes frame-packing==5 3D playback on some decoders (PlayStation 3, Sony W8 series, possibly others). --- encoder/encoder.c | 16 ++++++++-------- encoder/set.c | 4 +++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/encoder/encoder.c b/encoder/encoder.c index fad8b3d9..e4840461 100644 --- a/encoder/encoder.c +++ b/encoder/encoder.c @@ -3539,15 +3539,15 @@ int x264_encoder_encode( x264_t *h, return -1; overhead += h->out.nal[h->out.i_nal-1].i_payload + SEI_OVERHEAD; } + } - if( h->param.i_frame_packing >= 0 ) - { - x264_nal_start( h, NAL_SEI, NAL_PRIORITY_DISPOSABLE ); - x264_sei_frame_packing_write( h, &h->out.bs ); - if( x264_nal_end( h ) ) - return -1; - overhead += h->out.nal[h->out.i_nal-1].i_payload + SEI_OVERHEAD; - } + if( h->param.i_frame_packing >= 0 && (h->fenc->b_keyframe || h->param.i_frame_packing == 5) ) + { + x264_nal_start( h, NAL_SEI, NAL_PRIORITY_DISPOSABLE ); + x264_sei_frame_packing_write( h, &h->out.bs ); + if( x264_nal_end( h ) ) + return -1; + overhead += h->out.nal[h->out.i_nal-1].i_payload + SEI_OVERHEAD; } /* generate sei pic timing */ diff --git a/encoder/set.c b/encoder/set.c index 6b0881bf..bada400f 100644 --- a/encoder/set.c +++ b/encoder/set.c @@ -675,7 +675,9 @@ void x264_sei_frame_packing_write( x264_t *h, bs_t *s ) bs_write( &q, 4, 0 ); // frame1_grid_position_y } bs_write( &q, 8, 0 ); // frame_packing_arrangement_reserved_byte - bs_write_ue( &q, 1 ); // frame_packing_arrangement_repetition_period + // "frame_packing_arrangement_repetition_period equal to 1 specifies that the frame packing arrangement SEI message persists in output" + // for (i_frame_packing == 5) this will undermine current_frame_is_frame0_flag which must alternate every view sequence + bs_write_ue( &q, h->param.i_frame_packing != 5 ); // frame_packing_arrangement_repetition_period bs_write1( &q, 0 ); // frame_packing_arrangement_extension_flag bs_align_10( &q ); -- 2.50.1