1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2010-2017 L-SMASH project
6 * Authors: Yusuke Nakamura <muken.the.vfrmaniac@gmail.com>
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 *****************************************************************************/
21 /* This file is available under an ISC license. */
23 #include "common/internal.h" /* must be placed first */
31 isom_dcr_ps_entry_t
*isom_create_ps_entry
37 isom_dcr_ps_entry_t
*entry
= lsmash_malloc( sizeof(isom_dcr_ps_entry_t
) );
40 entry
->nalUnit
= lsmash_memdup( ps
, ps_size
);
46 entry
->nalUnitLength
= ps_size
;
51 void isom_remove_dcr_ps
53 isom_dcr_ps_entry_t
*ps
58 lsmash_free( ps
->nalUnit
);
62 /* Convert EBSP (Encapsulated Byte Sequence Packets) to RBSP (Raw Byte Sequence Packets). */
63 static uint8_t *nalu_remove_emulation_prevention
70 uint8_t *src_end
= src
+ src_length
;
71 while( src
< src_end
)
72 if( ((src
+ 2) < src_end
) && !src
[0] && !src
[1] && (src
[2] == 0x03) )
74 /* 0x000003 -> 0x0000 */
77 src
++; /* Skip emulation_prevention_three_byte (0x03). */
84 int nalu_import_rbsp_from_ebsp
93 uint8_t *rbsp_start
= rbsp_buffer
;
94 uint8_t *rbsp_end
= nalu_remove_emulation_prevention( ebsp
, ebsp_size
, rbsp_buffer
);
95 *rbsp_size
= (uint64_t)(rbsp_end
- rbsp_start
);
96 if( *rbsp_size
> ebsp_size
)
97 return LSMASH_ERR_INVALID_DATA
;
98 return lsmash_bits_import_data( bits
, rbsp_start
, *rbsp_size
);
101 int nalu_check_more_rbsp_data
106 lsmash_bs_t
*bs
= bits
->bs
;
107 lsmash_buffer_t
*buffer
= &bs
->buffer
;
108 if( buffer
->pos
< buffer
->store
&& !(bits
->store
== 0 && (buffer
->store
== buffer
->pos
+ 1)) )
109 return 1; /* rbsp_trailing_bits will be placed at the next or later byte.
110 * Note: bs->pos points at the next byte if bits->store isn't empty. */
111 if( bits
->store
== 0 )
113 if( buffer
->store
== buffer
->pos
+ 1 )
114 return buffer
->data
[ buffer
->pos
] != 0x80;
115 /* No rbsp_trailing_bits is present in RBSP data. */
119 /* Check whether remainder of bits is identical to rbsp_trailing_bits. */
120 uint8_t remainder_bits
= bits
->cache
& ~(~0U << bits
->store
);
121 uint8_t rbsp_trailing_bits
= 1U << (bits
->store
- 1);
122 return remainder_bits
!= rbsp_trailing_bits
;
125 int nalu_get_max_ps_length
127 lsmash_entry_list_t
*ps_list
,
128 uint32_t *max_ps_length
132 for( lsmash_entry_t
*entry
= ps_list
->head
; entry
; entry
= entry
->next
)
134 isom_dcr_ps_entry_t
*ps
= (isom_dcr_ps_entry_t
*)entry
->data
;
136 return LSMASH_ERR_NAMELESS
;
139 *max_ps_length
= LSMASH_MAX( *max_ps_length
, ps
->nalUnitLength
);
144 int nalu_get_ps_count
146 lsmash_entry_list_t
*ps_list
,
151 for( lsmash_entry_t
*entry
= ps_list
? ps_list
->head
: NULL
; entry
; entry
= entry
->next
)
153 isom_dcr_ps_entry_t
*ps
= (isom_dcr_ps_entry_t
*)entry
->data
;
155 return LSMASH_ERR_NAMELESS
;
163 int nalu_check_same_ps_existence
165 lsmash_entry_list_t
*ps_list
,
170 for( lsmash_entry_t
*entry
= ps_list
->head
; entry
; entry
= entry
->next
)
172 isom_dcr_ps_entry_t
*ps
= (isom_dcr_ps_entry_t
*)entry
->data
;
174 return LSMASH_ERR_NAMELESS
;
177 if( ps
->nalUnitLength
== ps_length
&& !memcmp( ps
->nalUnit
, ps_data
, ps_length
) )
178 return 1; /* The same parameter set already exists. */
186 lsmash_entry_list_t
*list
,
190 for( uint8_t i
= 0; i
< entry_count
; i
++ )
192 isom_dcr_ps_entry_t
*data
= lsmash_malloc( sizeof(isom_dcr_ps_entry_t
) );
194 return LSMASH_ERR_MEMORY_ALLOC
;
195 if( lsmash_list_add_entry( list
, data
) < 0 )
198 return LSMASH_ERR_MEMORY_ALLOC
;
200 data
->nalUnitLength
= lsmash_bs_get_be16( bs
);
201 data
->nalUnit
= lsmash_bs_get_bytes( bs
, data
->nalUnitLength
);
204 lsmash_list_remove_entries( list
);
205 return LSMASH_ERR_NAMELESS
;
211 /* Return the offset from the beginning of stream if a start code is found.
212 * Return NALU_NO_START_CODE_FOUND otherwise. */
213 uint64_t nalu_find_first_start_code
218 uint64_t first_sc_head_pos
= 0;
221 if( lsmash_bs_is_error( bs
) )
222 return NALU_IO_ERROR
;
223 if( lsmash_bs_is_end( bs
, first_sc_head_pos
+ NALU_LONG_START_CODE_LENGTH
) )
224 return NALU_NO_START_CODE_FOUND
;
225 /* Invalid if encountered any value of non-zero before the first start code. */
226 if( lsmash_bs_show_byte( bs
, first_sc_head_pos
) )
227 return NALU_NO_START_CODE_FOUND
;
228 /* The first NALU of an AU in decoding order shall have long start code (0x00000001). */
229 if( 0x00000001 == lsmash_bs_show_be32( bs
, first_sc_head_pos
) )
233 return first_sc_head_pos
;
236 uint64_t nalu_get_codeNum
241 uint32_t leadingZeroBits
= 0;
242 for( int b
= 0; !b
; leadingZeroBits
++ )
243 b
= lsmash_bits_get( bits
, 1 );
245 return ((uint64_t)1 << leadingZeroBits
) - 1 + lsmash_bits_get( bits
, leadingZeroBits
);
248 int nalu_update_bitrate( isom_stbl_t
*stbl
, isom_mdhd_t
*mdhd
, uint32_t sample_description_index
)
250 isom_visual_entry_t
*sample_entry
= (isom_visual_entry_t
*)lsmash_list_get_entry_data( &stbl
->stsd
->list
, sample_description_index
);
251 if( LSMASH_IS_NON_EXISTING_BOX( sample_entry
) )
252 return LSMASH_ERR_INVALID_DATA
;
253 isom_btrt_t
*btrt
= (isom_btrt_t
*)isom_get_extension_box_format( &sample_entry
->extensions
, ISOM_BOX_TYPE_BTRT
);
254 if( LSMASH_IS_EXISTING_BOX( btrt
) )
256 uint32_t bufferSizeDB
;
259 int err
= isom_calculate_bitrate_description( stbl
, mdhd
, &bufferSizeDB
, &maxBitrate
, &avgBitrate
, sample_description_index
);
262 btrt
->bufferSizeDB
= bufferSizeDB
;
263 btrt
->maxBitrate
= maxBitrate
;
264 btrt
->avgBitrate
= avgBitrate
;