]> git.sesse.net Git - vlc/blob - modules/packetizer/h264.c
Added support for multiple SPS and/or PPS.
[vlc] / modules / packetizer / h264.c
1 /*****************************************************************************
2  * h264.c: h264/avc video packetizer
3  *****************************************************************************
4  * Copyright (C) 2001, 2002, 2006 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Eric Petit <titer@videolan.org>
9  *          Gildas Bazin <gbazin@videolan.org>
10  *          Derk-Jan Hartman <hartman at videolan dot org>
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25  *****************************************************************************/
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30
31 #ifdef HAVE_CONFIG_H
32 # include "config.h"
33 #endif
34
35 #include <vlc_common.h>
36 #include <vlc_plugin.h>
37 #include <vlc_sout.h>
38 #include <vlc_codec.h>
39 #include <vlc_block.h>
40
41 #include "vlc_block_helper.h"
42 #include "vlc_bits.h"
43
44 /*****************************************************************************
45  * Module descriptor
46  *****************************************************************************/
47 static int  Open ( vlc_object_t * );
48 static void Close( vlc_object_t * );
49
50 vlc_module_begin();
51     set_category( CAT_SOUT );
52     set_subcategory( SUBCAT_SOUT_PACKETIZER );
53     set_description( N_("H.264 video packetizer") );
54     set_capability( "packetizer", 50 );
55     set_callbacks( Open, Close );
56 vlc_module_end();
57
58
59 /****************************************************************************
60  * Local prototypes
61  ****************************************************************************/
62 static block_t *Packetize( decoder_t *, block_t ** );
63 static block_t *PacketizeAVC1( decoder_t *, block_t ** );
64
65 typedef struct
66 {
67     int i_nal_type;
68     int i_nal_ref_idc;
69
70     int i_frame_type;
71     int i_pic_parameter_set_id;
72     int i_frame_num;
73
74     int i_field_pic_flag;
75     int i_bottom_field_flag;
76
77     int i_idr_pic_id;
78
79     int i_pic_order_cnt_lsb;
80     int i_delta_pic_order_cnt_bottom;
81
82     int i_delta_pic_order_cnt0;
83     int i_delta_pic_order_cnt1;
84 } slice_t;
85
86 #define SPS_MAX (32)
87 #define PPS_MAX (256)
88 struct decoder_sys_t
89 {
90     block_bytestream_t bytestream;
91
92     int     i_state;
93     size_t  i_offset;
94     uint8_t startcode[4];
95
96     bool    b_slice;
97     block_t *p_frame;
98
99     bool   b_header;
100     bool   b_sps;
101     bool   b_pps;
102     block_t *pp_sps[SPS_MAX];
103     block_t *pp_pps[PPS_MAX];
104
105     /* avcC data */
106     int i_avcC_length_size;
107
108     /* Useful values of the Sequence Parameter Set */
109     int i_log2_max_frame_num;
110     int b_frame_mbs_only;
111     int i_pic_order_cnt_type;
112     int i_delta_pic_order_always_zero_flag;
113     int i_log2_max_pic_order_cnt_lsb;
114
115     /* Value from Picture Parameter Set */
116     int i_pic_order_present_flag;
117
118     /* Useful values of the Slice Header */
119     slice_t slice;
120 };
121
122 enum
123 {
124     STATE_NOSYNC,
125     STATE_NEXT_SYNC,
126 };
127
128 enum nal_unit_type_e
129 {
130     NAL_UNKNOWN = 0,
131     NAL_SLICE   = 1,
132     NAL_SLICE_DPA   = 2,
133     NAL_SLICE_DPB   = 3,
134     NAL_SLICE_DPC   = 4,
135     NAL_SLICE_IDR   = 5,    /* ref_idc != 0 */
136     NAL_SEI         = 6,    /* ref_idc == 0 */
137     NAL_SPS         = 7,
138     NAL_PPS         = 8,
139     NAL_AU_DELIMITER= 9
140     /* ref_idc == 0 for 6,9,10,11,12 */
141 };
142
143 enum nal_priority_e
144 {
145     NAL_PRIORITY_DISPOSABLE = 0,
146     NAL_PRIORITY_LOW        = 1,
147     NAL_PRIORITY_HIGH       = 2,
148     NAL_PRIORITY_HIGHEST    = 3,
149 };
150
151 static block_t *ParseNALBlock( decoder_t *, block_t * );
152
153 static block_t *CreateAnnexbNAL( decoder_t *, const uint8_t *p, int );
154
155 static block_t *OutputPicture( decoder_t *p_dec );
156 static void PutSPS( decoder_t *p_dec, block_t *p_frag );
157 static void PutPPS( decoder_t *p_dec, block_t *p_frag );
158 static void ParseSlice( decoder_t *p_dec, bool *pb_new_picture, slice_t *p_slice,
159                         int i_nal_ref_idc, int i_nal_type, const block_t *p_frag );
160
161
162 /*****************************************************************************
163  * Open: probe the packetizer and return score
164  * When opening after demux, the packetizer is only loaded AFTER the decoder
165  * That means that what you set in fmt_out is ignored by the decoder in this special case
166  *****************************************************************************/
167 static int Open( vlc_object_t *p_this )
168 {
169     decoder_t     *p_dec = (decoder_t*)p_this;
170     decoder_sys_t *p_sys;
171     int i;
172
173     if( p_dec->fmt_in.i_codec != VLC_FOURCC( 'h', '2', '6', '4') &&
174         p_dec->fmt_in.i_codec != VLC_FOURCC( 'H', '2', '6', '4') &&
175         p_dec->fmt_in.i_codec != VLC_FOURCC( 'V', 'S', 'S', 'H') &&
176         p_dec->fmt_in.i_codec != VLC_FOURCC( 'v', 's', 's', 'h') &&
177         p_dec->fmt_in.i_codec != VLC_FOURCC( 'D', 'A', 'V', 'C') &&
178         ( p_dec->fmt_in.i_codec != VLC_FOURCC( 'a', 'v', 'c', '1') ||
179           p_dec->fmt_in.i_extra < 7 ) )
180     {
181         return VLC_EGENERIC;
182     }
183
184     /* Allocate the memory needed to store the decoder's structure */
185     if( ( p_dec->p_sys = p_sys = malloc( sizeof(decoder_sys_t) ) ) == NULL )
186     {
187         return VLC_ENOMEM;
188     }
189     p_sys->i_state = STATE_NOSYNC;
190     p_sys->i_offset = 0;
191     p_sys->startcode[0] = 0;
192     p_sys->startcode[1] = 0;
193     p_sys->startcode[2] = 0;
194     p_sys->startcode[3] = 1;
195     p_sys->bytestream = block_BytestreamInit();
196     p_sys->b_slice = false;
197     p_sys->p_frame = NULL;
198     p_sys->b_header= false;
199     p_sys->b_sps   = false;
200     p_sys->b_pps   = false;
201     for( i = 0; i < SPS_MAX; i++ )
202         p_sys->pp_sps[i] = NULL;
203     for( i = 0; i < PPS_MAX; i++ )
204         p_sys->pp_pps[i] = NULL;
205
206     p_sys->slice.i_nal_type = -1;
207     p_sys->slice.i_nal_ref_idc = -1;
208     p_sys->slice.i_idr_pic_id = -1;
209     p_sys->slice.i_frame_num = -1;
210     p_sys->slice.i_frame_type = 0;
211     p_sys->slice.i_pic_parameter_set_id = -1;
212     p_sys->slice.i_field_pic_flag = 0;
213     p_sys->slice.i_bottom_field_flag = -1;
214     p_sys->slice.i_pic_order_cnt_lsb = -1;
215     p_sys->slice.i_delta_pic_order_cnt_bottom = -1;
216
217     /* Setup properties */
218     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
219     p_dec->fmt_out.i_codec = VLC_FOURCC( 'h', '2', '6', '4' );
220
221     if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'v', 'c', '1' ) )
222     {
223         /* This type of stream is produced by mp4 and matroska
224          * when we want to store it in another streamformat, you need to convert
225          * The fmt_in.p_extra should ALWAYS contain the avcC
226          * The fmt_out.p_extra should contain all the SPS and PPS with 4 byte startcodes */
227         uint8_t *p = &((uint8_t*)p_dec->fmt_in.p_extra)[4];
228         int i_sps, i_pps;
229         int i;
230
231         /* Parse avcC */
232         p_sys->i_avcC_length_size = 1 + ((*p++)&0x03);
233
234         /* Read SPS */
235         i_sps = (*p++)&0x1f;
236         for( i = 0; i < i_sps; i++ )
237         {
238             uint16_t i_length = GetWBE( p ); p += 2;
239             if( i_length >
240                 (uint8_t*)p_dec->fmt_in.p_extra + p_dec->fmt_in.i_extra - p )
241             {
242                 return VLC_EGENERIC;
243             }
244             block_t *p_sps = CreateAnnexbNAL( p_dec, p, i_length );
245             if( !p_sps )
246                 return VLC_EGENERIC;
247             ParseNALBlock( p_dec, p_sps );
248             p += i_length;
249         }
250         /* Read PPS */
251         i_pps = *p++;
252         for( i = 0; i < i_pps; i++ )
253         {
254             uint16_t i_length = GetWBE( p ); p += 2;
255             if( i_length >
256                 (uint8_t*)p_dec->fmt_in.p_extra + p_dec->fmt_in.i_extra - p )
257             {
258                 return VLC_EGENERIC;
259             }
260             block_t *p_pps = CreateAnnexbNAL( p_dec, p, i_length );
261             if( !p_pps )
262                 return VLC_EGENERIC;
263             ParseNALBlock( p_dec, p_pps );
264             p += i_length;
265         }
266         msg_Dbg( p_dec, "avcC length size=%d, sps=%d, pps=%d",
267                  p_sys->i_avcC_length_size, i_sps, i_pps );
268
269         if( !p_sys->b_sps || !p_sys->b_pps )
270             return VLC_EGENERIC;
271
272         /* FIXME: FFMPEG isn't happy at all if you leave this */
273         if( p_dec->fmt_out.i_extra > 0 )
274             free( p_dec->fmt_out.p_extra );
275         p_dec->fmt_out.i_extra = 0;
276         p_dec->fmt_out.p_extra = NULL;
277
278         /* Set the new extradata */
279         for( i = 0; i < SPS_MAX; i++ )
280         {
281             if( p_sys->pp_sps[i] )
282                 p_dec->fmt_out.i_extra += p_sys->pp_sps[i]->i_buffer;
283         }
284         for( i = 0; i < PPS_MAX; i++ )
285         {
286             if( p_sys->pp_pps[i] )
287                 p_dec->fmt_out.i_extra += p_sys->pp_pps[i]->i_buffer;
288         }
289         p_dec->fmt_out.p_extra = malloc( p_dec->fmt_out.i_extra );
290         if( p_dec->fmt_out.p_extra )
291         {
292             uint8_t *p_dst = p_dec->fmt_out.p_extra;
293
294             for( i = 0; i < SPS_MAX; i++ )
295             {
296                 if( p_sys->pp_sps[i] )
297                 {
298                     memcpy( p_dst, p_sys->pp_sps[i]->p_buffer, p_sys->pp_sps[i]->i_buffer );
299                     p_dst += p_sys->pp_sps[i]->i_buffer;
300                 }
301             }
302             for( i = 0; i < PPS_MAX; i++ )
303             {
304                 if( p_sys->pp_pps[i] )
305                 {
306                     memcpy( p_dst, p_sys->pp_pps[i]->p_buffer, p_sys->pp_pps[i]->i_buffer );
307                     p_dst += p_sys->pp_pps[i]->i_buffer;
308                 }
309             }
310             p_sys->b_header = true;
311         }
312         else
313         {
314             p_dec->fmt_out.i_extra = 0;
315         }
316
317         /* Set callback */
318         p_dec->pf_packetize = PacketizeAVC1;
319     }
320     else
321     {
322         /* This type of stream contains data with 3 of 4 byte startcodes
323          * The fmt_in.p_extra MAY contain SPS/PPS with 4 byte startcodes
324          * The fmt_out.p_extra should be the same */
325  
326         /* Set callback */
327         p_dec->pf_packetize = Packetize;
328
329         /* */
330         if( p_dec->fmt_in.i_extra > 0 )
331         {
332             block_t *p_init = block_New( p_dec, p_dec->fmt_in.i_extra );
333             block_t *p_pic;
334
335             memcpy( p_init->p_buffer, p_dec->fmt_in.p_extra,
336                     p_dec->fmt_in.i_extra );
337
338             while( ( p_pic = Packetize( p_dec, &p_init ) ) )
339             {
340                 /* Should not occur because we should only receive SPS/PPS */
341                 block_Release( p_pic );
342             }
343         }
344     }
345
346     return VLC_SUCCESS;
347 }
348
349 /*****************************************************************************
350  * Close: clean up the packetizer
351  *****************************************************************************/
352 static void Close( vlc_object_t *p_this )
353 {
354     decoder_t *p_dec = (decoder_t*)p_this;
355     decoder_sys_t *p_sys = p_dec->p_sys;
356     int i;
357
358     if( p_sys->p_frame ) block_ChainRelease( p_sys->p_frame );
359     for( i = 0; i < SPS_MAX; i++ )
360     {
361         if( p_sys->pp_sps[i] )
362             block_Release( p_sys->pp_sps[i] );
363     }
364     for( i = 0; i < PPS_MAX; i++ )
365     {
366         if( p_sys->pp_pps[i] )
367             block_Release( p_sys->pp_pps[i] );
368     }
369     block_BytestreamRelease( &p_sys->bytestream );
370     free( p_sys );
371 }
372
373 /****************************************************************************
374  * Packetize: the whole thing
375  * Search for the startcodes 3 or more bytes
376  * Feed ParseNALBlock ALWAYS with 4 byte startcode prepended NALs
377  ****************************************************************************/
378 static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
379 {
380     decoder_sys_t *p_sys = p_dec->p_sys;
381     block_t       *p_pic;
382
383     if( !pp_block || !*pp_block )
384         return NULL;
385
386     if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
387     {
388         if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
389         {
390             p_sys->i_state = STATE_NOSYNC;
391             block_BytestreamFlush( &p_sys->bytestream );
392
393             if( p_sys->p_frame )
394                 block_ChainRelease( p_sys->p_frame );
395             p_sys->p_frame = NULL;
396             p_sys->slice.i_frame_type = 0;
397             p_sys->b_slice = false;
398         }
399         block_Release( *pp_block );
400         return NULL;
401     }
402
403     block_BytestreamPush( &p_sys->bytestream, *pp_block );
404
405     for( ;; )
406     {
407         switch( p_sys->i_state )
408         {
409             case STATE_NOSYNC:
410                 /* Skip until 3 byte startcode 0 0 1 */
411                 if( block_FindStartcodeFromOffset( &p_sys->bytestream,
412                       &p_sys->i_offset, p_sys->startcode+1, 3 ) == VLC_SUCCESS)
413                 {
414                     p_sys->i_state = STATE_NEXT_SYNC;
415                 }
416
417                 if( p_sys->i_offset )
418                 {
419                     /* skip the data */
420                     block_SkipBytes( &p_sys->bytestream, p_sys->i_offset );
421                     p_sys->i_offset = 0;
422                     block_BytestreamFlush( &p_sys->bytestream );
423                 }
424
425                 if( p_sys->i_state != STATE_NEXT_SYNC )
426                 {
427                     /* Need more data */
428                     return NULL;
429                 }
430
431                 p_sys->i_offset = 1; /* To find next startcode */
432
433             case STATE_NEXT_SYNC:
434                 /* Find the next 3 byte startcode 0 0 1*/
435                 if( block_FindStartcodeFromOffset( &p_sys->bytestream,
436                       &p_sys->i_offset, p_sys->startcode+1, 3 ) != VLC_SUCCESS)
437                 {
438                     /* Need more data */
439                     return NULL;
440                 }
441
442                 /* Get the new fragment and set the pts/dts */
443                 p_pic = block_New( p_dec, p_sys->i_offset +1 );
444                 p_pic->i_pts = p_sys->bytestream.p_block->i_pts;
445                 p_pic->i_dts = p_sys->bytestream.p_block->i_dts;
446                 /* Force 4 byte startcode 0 0 0 1 */
447                 p_pic->p_buffer[0] = 0;
448
449                 block_GetBytes( &p_sys->bytestream, &p_pic->p_buffer[1],
450                                 p_pic->i_buffer-1 );
451
452                 /* Remove trailing 0 bytes */
453                 while( p_pic->i_buffer && (!p_pic->p_buffer[p_pic->i_buffer-1] ) )
454                     p_pic->i_buffer--;
455                 p_sys->i_offset = 0;
456
457                 /* Parse the NAL */
458                 if( !( p_pic = ParseNALBlock( p_dec, p_pic ) ) )
459                 {
460                     p_sys->i_state = STATE_NOSYNC;
461                     break;
462                 }
463 #if 0
464                 msg_Dbg( p_dec, "pts=%"PRId64" dts=%"PRId64,
465                          p_pic->i_pts, p_pic->i_dts );
466 #endif
467
468                 /* So p_block doesn't get re-added several times */
469                 *pp_block = block_BytestreamPop( &p_sys->bytestream );
470
471                 p_sys->i_state = STATE_NOSYNC;
472
473                 return p_pic;
474         }
475     }
476 }
477
478 /****************************************************************************
479  * PacketizeAVC1: Takes VCL blocks of data and creates annexe B type NAL stream
480  * Will always use 4 byte 0 0 0 1 startcodes
481  * Will prepend a SPS and PPS before each keyframe
482  ****************************************************************************/
483 static block_t *PacketizeAVC1( decoder_t *p_dec, block_t **pp_block )
484 {
485     decoder_sys_t *p_sys = p_dec->p_sys;
486     block_t       *p_block;
487     block_t       *p_ret = NULL;
488     uint8_t       *p;
489
490     if( !pp_block || !*pp_block )
491         return NULL;
492     if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
493     {
494         block_Release( *pp_block );
495         return NULL;
496     }
497
498     p_block = *pp_block;
499     *pp_block = NULL;
500
501     for( p = p_block->p_buffer; p < &p_block->p_buffer[p_block->i_buffer]; )
502     {
503         block_t *p_pic;
504         int i_size = 0;
505         int i;
506
507         for( i = 0; i < p_sys->i_avcC_length_size; i++ )
508         {
509             i_size = (i_size << 8) | (*p++);
510         }
511
512         if( i_size <= 0 ||
513             i_size > ( p_block->p_buffer + p_block->i_buffer - p ) )
514         {
515             msg_Err( p_dec, "Broken frame : size %d is too big", i_size );
516             break;
517         }
518
519         block_t *p_part = CreateAnnexbNAL( p_dec, p, i_size );
520         if( !p_part )
521             break;
522         p_part->i_dts = p_block->i_dts;
523         p_part->i_pts = p_block->i_pts;
524
525         /* Parse the NAL */
526         if( ( p_pic = ParseNALBlock( p_dec, p_part ) ) )
527         {
528             block_ChainAppend( &p_ret, p_pic );
529         }
530         p += i_size;
531     }
532     block_Release( p_block );
533
534     return p_ret;
535 }
536
537 /****************************************************************************
538  * Helpers
539  ****************************************************************************/
540 static block_t *CreateAnnexbNAL( decoder_t *p_dec, const uint8_t *p, int i_size )
541 {
542     block_t *p_nal;
543
544     p_nal = block_New( p_dec, 4 + i_size );
545     if( !p_nal ) return NULL;
546
547     /* Add start code */
548     p_nal->p_buffer[0] = 0x00;
549     p_nal->p_buffer[1] = 0x00;
550     p_nal->p_buffer[2] = 0x00;
551     p_nal->p_buffer[3] = 0x01;
552
553     /* Copy nalu */
554     memcpy( &p_nal->p_buffer[4], p, i_size );
555
556     VLC_UNUSED(p_dec);
557     return p_nal;
558 }
559
560 static void CreateDecodedNAL( uint8_t **pp_ret, int *pi_ret,
561                               const uint8_t *src, int i_src )
562 {
563     const uint8_t *end = &src[i_src];
564     uint8_t *dst = malloc( i_src );
565
566     *pp_ret = dst;
567
568     if( dst )
569     {
570         while( src < end )
571         {
572             if( src < end - 3 && src[0] == 0x00 && src[1] == 0x00 &&
573                 src[2] == 0x03 )
574             {
575                 *dst++ = 0x00;
576                 *dst++ = 0x00;
577
578                 src += 3;
579                 continue;
580             }
581             *dst++ = *src++;
582         }
583     }
584     *pi_ret = dst - *pp_ret;
585 }
586
587 static inline int bs_read_ue( bs_t *s )
588 {
589     int i = 0;
590
591     while( bs_read1( s ) == 0 && s->p < s->p_end && i < 32 )
592     {
593         i++;
594     }
595     return( ( 1 << i) - 1 + bs_read( s, i ) );
596 }
597
598 static inline int bs_read_se( bs_t *s )
599 {
600     int val = bs_read_ue( s );
601
602     return val&0x01 ? (val+1)/2 : -(val/2);
603 }
604
605 /*****************************************************************************
606  * ParseNALBlock: parses annexB type NALs
607  * All p_frag blocks are required to start with 0 0 0 1 4-byte startcode
608  *****************************************************************************/
609 static block_t *ParseNALBlock( decoder_t *p_dec, block_t *p_frag )
610 {
611     decoder_sys_t *p_sys = p_dec->p_sys;
612     block_t *p_pic = NULL;
613
614     const int i_nal_ref_idc = (p_frag->p_buffer[4] >> 5)&0x03;
615     const int i_nal_type = p_frag->p_buffer[4]&0x1f;
616
617     if( p_sys->b_slice && ( !p_sys->b_sps || !p_sys->b_pps ) )
618     {
619         block_ChainRelease( p_sys->p_frame );
620         msg_Warn( p_dec, "waiting for SPS/PPS" );
621
622         /* Reset context */
623         p_sys->slice.i_frame_type = 0;
624         p_sys->p_frame = NULL;
625         p_sys->b_slice = false;
626     }
627
628     if( ( !p_sys->b_sps || !p_sys->b_pps ) &&
629         i_nal_type >= NAL_SLICE && i_nal_type <= NAL_SLICE_IDR )
630     {
631         p_sys->b_slice = true;
632         /* Fragment will be discarded later on */
633     }
634     else if( i_nal_type >= NAL_SLICE && i_nal_type <= NAL_SLICE_IDR )
635     {
636         slice_t slice;
637         bool b_new_picture;
638
639         ParseSlice( p_dec, &b_new_picture, &slice, i_nal_ref_idc, i_nal_type, p_frag );
640
641         /* */
642         if( b_new_picture && p_sys->b_slice )
643             p_pic = OutputPicture( p_dec );
644
645         /* */
646         p_sys->slice = slice;
647         p_sys->b_slice = true;
648     }
649     else if( i_nal_type == NAL_SPS )
650     {
651         if( p_sys->b_slice )
652             p_pic = OutputPicture( p_dec );
653
654         PutSPS( p_dec, p_frag );
655
656         /* Do not append the SPS because we will insert it on keyframes */
657         return p_pic;
658     }
659     else if( i_nal_type == NAL_PPS )
660     {
661         if( p_sys->b_slice )
662             p_pic = OutputPicture( p_dec );
663
664         PutPPS( p_dec, p_frag );
665
666         /* Do not append the PPS because we will insert it on keyframes */
667         return p_pic;
668     }
669     else if( i_nal_type == NAL_AU_DELIMITER ||
670              i_nal_type == NAL_SEI ||
671              ( i_nal_type >= 13 && i_nal_type <= 18 ) )
672     {
673         if( p_sys->b_slice )
674             p_pic = OutputPicture( p_dec );
675
676         /* TODO parse SEI for CC support */
677     }
678
679     /* Append the block */
680     block_ChainAppend( &p_sys->p_frame, p_frag );
681
682     return p_pic;
683 }
684
685 static block_t *OutputPicture( decoder_t *p_dec )
686 {
687     decoder_sys_t *p_sys = p_dec->p_sys;
688     block_t *p_pic;
689
690     if( !p_sys->b_header && p_sys->slice.i_frame_type != BLOCK_FLAG_TYPE_I)
691         return NULL;
692
693     if( p_sys->slice.i_frame_type == BLOCK_FLAG_TYPE_I && p_sys->b_sps && p_sys->b_pps )
694     {
695         block_t *p_list = NULL;
696         int i;
697
698         for( i = 0; i < SPS_MAX; i++ )
699         {
700             if( p_sys->pp_sps[i] )
701                 block_ChainAppend( &p_list, block_Duplicate( p_sys->pp_sps[i] ) );
702         }
703         for( i = 0; i < PPS_MAX; i++ )
704         {
705             if( p_sys->pp_pps[i] )
706                 block_ChainAppend( &p_list, block_Duplicate( p_sys->pp_pps[i] ) );
707         }
708         if( p_list )
709         {
710             p_list->i_dts = p_sys->p_frame->i_dts;
711             p_list->i_pts = p_sys->p_frame->i_pts;
712             p_sys->b_header = true;
713         }
714         block_ChainAppend( &p_list, p_sys->p_frame );
715         p_pic = block_ChainGather( p_list );
716     }
717     else
718     {
719         p_pic = block_ChainGather( p_sys->p_frame );
720     }
721     p_pic->i_length = 0;    /* FIXME */
722     p_pic->i_flags |= p_sys->slice.i_frame_type;
723
724     p_sys->slice.i_frame_type = 0;
725     p_sys->p_frame = NULL;
726     p_sys->b_slice = false;
727
728     return p_pic;
729 }
730
731 static void PutSPS( decoder_t *p_dec, block_t *p_frag )
732 {
733     decoder_sys_t *p_sys = p_dec->p_sys;
734
735     uint8_t *pb_dec = NULL;
736     int     i_dec = 0;
737     bs_t s;
738     int i_tmp;
739     int i_sps_id;
740
741     CreateDecodedNAL( &pb_dec, &i_dec, &p_frag->p_buffer[5],
742                      p_frag->i_buffer - 5 );
743
744     bs_init( &s, pb_dec, i_dec );
745     /* Skip profile(8), constraint_set012, reserver(5), level(8) */
746     bs_skip( &s, 8 + 1+1+1 + 5 + 8 );
747     /* sps id */
748     i_sps_id = bs_read_ue( &s );
749     if( i_sps_id >= SPS_MAX )
750     {
751         msg_Warn( p_dec, "invalid SPS (sps_id=%d)", i_sps_id );
752         free( pb_dec );
753         block_Release( p_frag );
754         return;
755     }
756
757     /* Skip i_log2_max_frame_num */
758     p_sys->i_log2_max_frame_num = bs_read_ue( &s );
759     if( p_sys->i_log2_max_frame_num > 12)
760         p_sys->i_log2_max_frame_num = 12;
761     /* Read poc_type */
762     p_sys->i_pic_order_cnt_type = bs_read_ue( &s );
763     if( p_sys->i_pic_order_cnt_type == 0 )
764     {
765         /* skip i_log2_max_poc_lsb */
766         p_sys->i_log2_max_pic_order_cnt_lsb = bs_read_ue( &s );
767         if( p_sys->i_log2_max_pic_order_cnt_lsb > 12 )
768             p_sys->i_log2_max_pic_order_cnt_lsb = 12;
769     }
770     else if( p_sys->i_pic_order_cnt_type == 1 )
771     {
772         int i_cycle;
773         /* skip b_delta_pic_order_always_zero */
774         p_sys->i_delta_pic_order_always_zero_flag = bs_read( &s, 1 );
775         /* skip i_offset_for_non_ref_pic */
776         bs_read_se( &s );
777         /* skip i_offset_for_top_to_bottom_field */
778         bs_read_se( &s );
779         /* read i_num_ref_frames_in_poc_cycle */
780         i_cycle = bs_read_ue( &s );
781         if( i_cycle > 256 ) i_cycle = 256;
782         while( i_cycle > 0 )
783         {
784             /* skip i_offset_for_ref_frame */
785             bs_read_se(&s );
786         }
787     }
788     /* i_num_ref_frames */
789     bs_read_ue( &s );
790     /* b_gaps_in_frame_num_value_allowed */
791     bs_skip( &s, 1 );
792
793     /* Read size */
794     p_dec->fmt_out.video.i_width  = 16 * ( bs_read_ue( &s ) + 1 );
795     p_dec->fmt_out.video.i_height = 16 * ( bs_read_ue( &s ) + 1 );
796
797     /* b_frame_mbs_only */
798     p_sys->b_frame_mbs_only = bs_read( &s, 1 );
799     if( p_sys->b_frame_mbs_only == 0 )
800     {
801         bs_skip( &s, 1 );
802     }
803     /* b_direct8x8_inference */
804     bs_skip( &s, 1 );
805
806     /* crop */
807     i_tmp = bs_read( &s, 1 );
808     if( i_tmp )
809     {
810         /* left */
811         bs_read_ue( &s );
812         /* right */
813         bs_read_ue( &s );
814         /* top */
815         bs_read_ue( &s );
816         /* bottom */
817         bs_read_ue( &s );
818     }
819
820     /* vui */
821     i_tmp = bs_read( &s, 1 );
822     if( i_tmp )
823     {
824         /* read the aspect ratio part if any FIXME check it */
825         i_tmp = bs_read( &s, 1 );
826         if( i_tmp )
827         {
828             static const struct { int w, h; } sar[17] =
829             {
830                 { 0,   0 }, { 1,   1 }, { 12, 11 }, { 10, 11 },
831                 { 16, 11 }, { 40, 33 }, { 24, 11 }, { 20, 11 },
832                 { 32, 11 }, { 80, 33 }, { 18, 11 }, { 15, 11 },
833                 { 64, 33 }, { 160,99 }, {  4,  3 }, {  3,  2 },
834                 {  2,  1 },
835             };
836             int i_sar = bs_read( &s, 8 );
837             int w, h;
838
839             if( i_sar < 17 )
840             {
841                 w = sar[i_sar].w;
842                 h = sar[i_sar].h;
843             }
844             else if( i_sar == 255 )
845             {
846                 w = bs_read( &s, 16 );
847                 h = bs_read( &s, 16 );
848             }
849             else
850             {
851                 w = 0;
852                 h = 0;
853             }
854             if( h != 0 )
855                 p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR * w /
856                     h * p_dec->fmt_out.video.i_width /
857                     p_dec->fmt_out.video.i_height;
858             else
859                 p_dec->fmt_out.video.i_aspect = VOUT_ASPECT_FACTOR;
860         }
861     }
862
863     free( pb_dec );
864
865     /* We have a new SPS */
866     if( !p_sys->b_sps )
867         msg_Dbg( p_dec, "found NAL_SPS (sps_id=%d)", i_sps_id );
868     p_sys->b_sps = true;
869
870     if( p_sys->pp_sps[i_sps_id] )
871         block_Release( p_sys->pp_sps[i_sps_id] );
872     p_sys->pp_sps[i_sps_id] = p_frag;
873 }
874
875 static void PutPPS( decoder_t *p_dec, block_t *p_frag )
876 {
877     decoder_sys_t *p_sys = p_dec->p_sys;
878     bs_t s;
879     int i_pps_id;
880     int i_sps_id;
881
882     bs_init( &s, &p_frag->p_buffer[5], p_frag->i_buffer - 5 );
883     i_pps_id = bs_read_ue( &s ); // pps id
884     i_sps_id = bs_read_ue( &s ); // sps id
885     if( i_pps_id >= PPS_MAX || i_sps_id >= SPS_MAX )
886     {
887         msg_Warn( p_dec, "invalid PPS (pps_id=%d sps_id=%d)", i_pps_id, i_sps_id );
888         block_Release( p_frag );
889         return;
890     }
891     bs_skip( &s, 1 ); // entropy coding mode flag
892     p_sys->i_pic_order_present_flag = bs_read( &s, 1 );
893     /* TODO */
894
895     /* We have a new PPS */
896     if( !p_sys->b_pps )
897         msg_Dbg( p_dec, "found NAL_PPS (pps_id=%d sps_id=%d)", i_pps_id, i_sps_id );
898     p_sys->b_pps = true;
899
900     if( p_sys->pp_pps[i_pps_id] )
901         block_Release( p_sys->pp_pps[i_pps_id] );
902     p_sys->pp_pps[i_pps_id] = p_frag;
903 }
904
905 static void ParseSlice( decoder_t *p_dec, bool *pb_new_picture, slice_t *p_slice,
906                         int i_nal_ref_idc, int i_nal_type, const block_t *p_frag )
907 {
908     decoder_sys_t *p_sys = p_dec->p_sys;
909     uint8_t *pb_dec;
910     int i_dec;
911     int i_first_mb, i_slice_type;
912     slice_t slice;
913     bs_t s;
914
915     /* do not convert the whole frame */
916     CreateDecodedNAL( &pb_dec, &i_dec, &p_frag->p_buffer[5],
917                      __MIN( p_frag->i_buffer - 5, 60 ) );
918     bs_init( &s, pb_dec, i_dec );
919
920     /* first_mb_in_slice */
921     i_first_mb = bs_read_ue( &s );
922
923     /* slice_type */
924     switch( (i_slice_type = bs_read_ue( &s )) )
925     {
926     case 0: case 5:
927         slice.i_frame_type = BLOCK_FLAG_TYPE_P;
928         break;
929     case 1: case 6:
930         slice.i_frame_type = BLOCK_FLAG_TYPE_B;
931         break;
932     case 2: case 7:
933         slice.i_frame_type = BLOCK_FLAG_TYPE_I;
934         break;
935     case 3: case 8: /* SP */
936         slice.i_frame_type = BLOCK_FLAG_TYPE_P;
937         break;
938     case 4: case 9:
939         slice.i_frame_type = BLOCK_FLAG_TYPE_I;
940         break;
941     default:
942         slice.i_frame_type = 0;
943         break;
944     }
945
946     /* */
947     slice.i_nal_type = i_nal_type;
948     slice.i_nal_ref_idc = i_nal_ref_idc;
949
950     slice.i_pic_parameter_set_id = bs_read_ue( &s );
951     slice.i_frame_num = bs_read( &s, p_sys->i_log2_max_frame_num + 4 );
952
953     slice.i_field_pic_flag = 0;
954     slice.i_bottom_field_flag = -1;
955     if( !p_sys->b_frame_mbs_only )
956     {
957         /* field_pic_flag */
958         slice.i_field_pic_flag = bs_read( &s, 1 );
959         if( slice.i_field_pic_flag )
960             slice.i_bottom_field_flag = bs_read( &s, 1 );
961     }
962
963     slice.i_idr_pic_id = p_sys->slice.i_idr_pic_id;
964     if( slice.i_nal_type == NAL_SLICE_IDR )
965         slice.i_idr_pic_id = bs_read_ue( &s );
966
967     slice.i_pic_order_cnt_lsb = -1;
968     slice.i_delta_pic_order_cnt_bottom = -1;
969     slice.i_delta_pic_order_cnt0 = 0;
970     slice.i_delta_pic_order_cnt1 = 0;
971     if( p_sys->i_pic_order_cnt_type == 0 )
972     {
973         slice.i_pic_order_cnt_lsb = bs_read( &s, p_sys->i_log2_max_pic_order_cnt_lsb + 4 );
974         if( p_sys->i_pic_order_present_flag && !slice.i_field_pic_flag )
975             slice.i_delta_pic_order_cnt_bottom = bs_read_se( &s );
976     }
977     else if( (p_sys->i_pic_order_cnt_type == 1) &&
978              (!p_sys->i_delta_pic_order_always_zero_flag) )
979     {
980         slice.i_delta_pic_order_cnt0 = bs_read_se( &s );
981         if( p_sys->i_pic_order_present_flag && !slice.i_field_pic_flag )
982             slice.i_delta_pic_order_cnt1 = bs_read_se( &s );
983     }
984     free( pb_dec );
985
986     /* Detection of the first VCL NAL unit of a primary coded picture
987      * (cf. 7.4.1.2.4) */
988     bool b_pic = false;
989     if( slice.i_frame_num != p_sys->slice.i_frame_num ||
990         slice.i_pic_parameter_set_id != p_sys->slice.i_pic_parameter_set_id ||
991         slice.i_field_pic_flag != p_sys->slice.i_field_pic_flag ||
992         slice.i_nal_ref_idc != p_sys->slice.i_nal_ref_idc )
993         b_pic = true;
994     if( (slice.i_bottom_field_flag != -1) &&
995         (p_sys->slice.i_bottom_field_flag != -1) &&
996         (slice.i_bottom_field_flag != p_sys->slice.i_bottom_field_flag) )
997         b_pic = true;
998     if( p_sys->i_pic_order_cnt_type == 0 &&
999         ( slice.i_pic_order_cnt_lsb != p_sys->slice.i_pic_order_cnt_lsb ||
1000           slice.i_delta_pic_order_cnt_bottom != p_sys->slice.i_delta_pic_order_cnt_bottom ) )
1001         b_pic = true;
1002     else if( p_sys->i_pic_order_cnt_type == 1 &&
1003              ( slice.i_delta_pic_order_cnt0 != p_sys->slice.i_delta_pic_order_cnt0 ||
1004                slice.i_delta_pic_order_cnt1 != p_sys->slice.i_delta_pic_order_cnt1 ) )
1005         b_pic = true;
1006     if( ( slice.i_nal_type == NAL_SLICE_IDR || p_sys->slice.i_nal_type == NAL_SLICE_IDR ) &&
1007         ( slice.i_nal_type != p_sys->slice.i_nal_type || slice.i_idr_pic_id != p_sys->slice.i_idr_pic_id ) )
1008             b_pic = true;
1009
1010     /* */
1011     *pb_new_picture = b_pic;
1012     *p_slice = slice;
1013 }
1014
1015