You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
2.0 KiB
55 lines
2.0 KiB
/*****************************************************************************
|
|
* minibox.h: minimal mp4 box iterator
|
|
*****************************************************************************
|
|
* Copyright (C) 2017 VideoLabs, VLC authors and VideoLAN
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation; either version 2.1 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
*****************************************************************************/
|
|
|
|
typedef struct
|
|
{
|
|
const uint8_t *p_buffer;
|
|
size_t i_buffer;
|
|
const uint8_t *p_payload;
|
|
size_t i_payload;
|
|
vlc_fourcc_t i_type;
|
|
} mp4_box_iterator_t;
|
|
|
|
static void mp4_box_iterator_Init( mp4_box_iterator_t *p_it,
|
|
const uint8_t *p_data, size_t i_data )
|
|
{
|
|
p_it->p_buffer = p_data;
|
|
p_it->i_buffer = i_data;
|
|
}
|
|
|
|
static bool mp4_box_iterator_Next( mp4_box_iterator_t *p_it )
|
|
{
|
|
while( p_it->i_buffer > 8 )
|
|
{
|
|
const uint8_t *p = p_it->p_buffer;
|
|
const size_t i_size = GetDWBE( p );
|
|
p_it->i_type = VLC_FOURCC(p[4], p[5], p[6], p[7]);
|
|
if( i_size >= 8 && i_size <= p_it->i_buffer )
|
|
{
|
|
p_it->p_payload = &p_it->p_buffer[8];
|
|
p_it->i_payload = i_size - 8;
|
|
/* update for next run */
|
|
p_it->p_buffer += i_size;
|
|
p_it->i_buffer -= i_size;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|