Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
ff3794bc
Commit
ff3794bc
authored
Jul 21, 2002
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* all : enable cinepak, clean some functions, fix some memory leaks
parent
d710a2d5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
204 additions
and
348 deletions
+204
-348
plugins/mp4/libmp4.c
plugins/mp4/libmp4.c
+200
-346
plugins/mp4/libmp4.h
plugins/mp4/libmp4.h
+2
-1
plugins/mp4/mp4.h
plugins/mp4/mp4.h
+2
-1
No files found.
plugins/mp4/libmp4.c
View file @
ff3794bc
...
...
@@ -2,7 +2,7 @@
* libmp4.c : LibMP4 library for mp4 module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: libmp4.c,v 1.
1 2002/07/17 21:37:27
fenrir Exp $
* $Id: libmp4.c,v 1.
2 2002/07/21 15:13:19
fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -51,7 +51,7 @@
dst = GetWBE( p_peek ); p_peek += 2; i_read -= 2
#define MP4_GET3BYTES( dst ) \
dst = Get
DWBE( p_peek ) >> 8
; p_peek += 3; i_read -= 3
dst = Get
24bBE( p_peek )
; p_peek += 3; i_read -= 3
#define MP4_GET4BYTES( dst ) \
dst = GetDWBE( p_peek ); p_peek += 4; i_read -= 4
...
...
@@ -63,8 +63,8 @@
MP4_GET1BYTE( p_void->i_version ); \
MP4_GET3BYTES( p_void->i_flags )
#define MP4_GETSTRING( p_str ) \
if(
p_peek[0]
) \
#define MP4_GETSTRING
Z
( p_str ) \
if(
( i_read > 0 )&&(p_peek[0] )
) \
{ \
p_str = calloc( sizeof( char ), __MIN( strlen( p_peek ), i_read )+1);\
memcpy( p_str, p_peek, __MIN( strlen( p_peek ), i_read ) ); \
...
...
@@ -109,6 +109,10 @@
} \
return( i_code )
#define FREE( p ) \
if( p ) {free( p ); p = NULL; }
/* Some assumptions:
* The input method HAVE to be seekable
...
...
@@ -116,42 +120,48 @@
*/
/* Some functions to manipulate memory */
static
inline
u16
GetWLE
(
u8
*
p_buff
)
static
u16
GetWLE
(
u8
*
p_buff
)
{
return
(
(
p_buff
[
0
])
+
(
p_buff
[
1
]
<<
8
)
);
}
static
inline
u32
GetDWLE
(
u8
*
p_buff
)
static
u32
GetDWLE
(
u8
*
p_buff
)
{
return
(
p_buff
[
0
]
+
(
p_buff
[
1
]
<<
8
)
+
(
p_buff
[
2
]
<<
16
)
+
(
p_buff
[
3
]
<<
24
)
);
}
static
inline
u16
GetWBE
(
u8
*
p_buff
)
static
u16
GetWBE
(
u8
*
p_buff
)
{
return
(
(
p_buff
[
0
]
<<
8
)
+
p_buff
[
1
]
);
}
static
inline
u32
GetDWBE
(
u8
*
p_buff
)
static
u32
Get24bBE
(
u8
*
p_buff
)
{
return
(
(
p_buff
[
0
]
<<
16
)
+
(
p_buff
[
1
]
<<
8
)
+
p_buff
[
2
]
);
}
static
u32
GetDWBE
(
u8
*
p_buff
)
{
return
(
(
p_buff
[
0
]
<<
24
)
+
(
p_buff
[
1
]
<<
16
)
+
(
p_buff
[
2
]
<<
8
)
+
p_buff
[
3
]
);
}
static
inline
u64
GetQWBE
(
u8
*
p_buff
)
static
u64
GetQWBE
(
u8
*
p_buff
)
{
return
(
(
(
u64
)
GetDWBE
(
p_buff
)
<<
32
)
|
(
(
u64
)
GetDWBE
(
p_buff
+
4
)
)
);
}
static
inline
void
GetUUID
(
UUID_t
*
p_uuid
,
u8
*
p_buff
)
static
void
GetUUID
(
UUID_t
*
p_uuid
,
u8
*
p_buff
)
{
memcpy
(
p_uuid
,
p_buff
,
16
);
}
static
inline
void
CreateUUID
(
UUID_t
*
p_uuid
,
u32
i_fourcc
)
static
void
CreateUUID
(
UUID_t
*
p_uuid
,
u32
i_fourcc
)
{
/* made by 0xXXXXXXXX-0011-0010-8000-00aa00389b71
where XXXXXXXX is the fourcc */
...
...
@@ -571,18 +581,14 @@ int MP4_ReadBoxContainer( MP4_Stream_t *p_stream, MP4_Box_t *p_container )
void
MP4_FreeBox_Common
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
if
(
p_box
->
data
.
p_data
)
{
free
(
p_box
->
data
.
p_data
);
p_box
->
data
.
p_data
=
NULL
;
}
/* Up to now do nothing */
}
int
MP4_ReadBoxSkip
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
/* Nothing to do */
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"
Skip box:
\"
%c%c%c%c
\"
"
,
msg_Dbg
(
p_stream
->
p_input
,
"Skip box:
\"
%c%c%c%c
\"
"
,
(
p_box
->
i_type
>>
24
)
&
0xff
,
(
p_box
->
i_type
>>
16
)
&
0xff
,
(
p_box
->
i_type
>>
8
)
&
0xff
,
...
...
@@ -617,6 +623,11 @@ int MP4_ReadBox_ftyp( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_ftyp
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_ftyp
->
i_compatible_brands
);
}
int
MP4_ReadBox_mvhd
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
...
...
@@ -755,7 +766,6 @@ int MP4_ReadBox_tkhd( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
int
MP4_ReadBox_tref
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
MP4_Box_t
*
p_ref
;
if
(
p_box
->
i_size
<
MP4_BOX_HEADERSIZE
(
p_box
)
+
8
)
{
...
...
@@ -767,49 +777,9 @@ int MP4_ReadBox_tref( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
{
return
(
0
);
}
do
{
p_ref
=
malloc
(
sizeof
(
MP4_Box_t
)
);
if
(
MP4_ReadBoxCommon
(
p_stream
,
p_ref
)
)
{
switch
(
p_ref
->
i_type
)
{
case
(
FOURCC_hint
):
case
(
FOURCC_dpnd
):
case
(
FOURCC_ipir
):
case
(
FOURCC_mpod
):
default:
msg_Warn
(
p_stream
->
p_input
,
"Unknown TrackReferenceType %c%c%c%c (uncompletetly loaded)"
,
(
p_ref
->
i_type
>>
24
)
&
0xff
,
(
p_ref
->
i_type
>>
16
)
&
0xff
,
(
p_ref
->
i_type
>>
8
)
&
0xff
,
(
p_ref
->
i_type
)
&
0xff
);
break
;
}
/* chain this box with the father and the other at same level */
if
(
!
p_box
->
p_first
)
{
p_box
->
p_first
=
p_ref
;
p_box
->
p_last
=
p_ref
;
}
else
{
p_box
->
p_last
->
p_next
=
p_ref
;
p_box
->
p_last
=
p_ref
;
}
p_ref
->
p_father
=
p_box
;
}
else
{
/* free memory */
free
(
p_ref
);
}
}
while
(
MP4_NextBox
(
p_stream
,
p_ref
)
==
1
);
MP4_ReadBoxContainerRaw
(
p_stream
,
p_box
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
tref
\"
"
);
...
...
@@ -896,6 +866,11 @@ int MP4_ReadBox_hdlr( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_hdlr
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_hdlr
->
psz_name
);
}
int
MP4_ReadBox_vmhd
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -931,7 +906,7 @@ int MP4_ReadBox_smhd( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_GET2BYTES
(
p_box
->
data
.
p_smhd
->
i_balance
);
MP4_GET
4
BYTES
(
p_box
->
data
.
p_smhd
->
i_reserved
);
MP4_GET
2
BYTES
(
p_box
->
data
.
p_smhd
->
i_reserved
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
smhd
\"
balance %f"
,
...
...
@@ -972,7 +947,7 @@ int MP4_ReadBox_url( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_ENTER
(
MP4_Box_data_url_t
);
MP4_GETVERSIONFLAGS
(
p_box
->
data
.
p_url
);
MP4_GETSTRING
(
p_box
->
data
.
p_url
->
psz_location
);
MP4_GETSTRING
Z
(
p_box
->
data
.
p_url
->
psz_location
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
url
\"
url: %s"
,
...
...
@@ -982,14 +957,20 @@ int MP4_ReadBox_url( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_url
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_url
->
psz_location
)
}
int
MP4_ReadBox_urn
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
MP4_READBOX_ENTER
(
MP4_Box_data_urn_t
);
MP4_GETVERSIONFLAGS
(
p_box
->
data
.
p_urn
);
MP4_GETSTRING
(
p_box
->
data
.
p_urn
->
psz_name
);
MP4_GETSTRING
(
p_box
->
data
.
p_urn
->
psz_location
);
MP4_GETSTRING
Z
(
p_box
->
data
.
p_urn
->
psz_name
);
MP4_GETSTRING
Z
(
p_box
->
data
.
p_urn
->
psz_location
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
urn
\"
name %s location %s"
,
...
...
@@ -998,7 +979,11 @@ int MP4_ReadBox_urn( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
#endif
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_urn
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_urn
->
psz_name
);
FREE
(
p_box
->
data
.
p_urn
->
psz_location
);
}
int
MP4_ReadBox_dref
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
...
...
@@ -1020,6 +1005,7 @@ int MP4_ReadBox_dref( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
int
MP4_ReadBox_stts
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1048,6 +1034,13 @@ int MP4_ReadBox_stts( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stts
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_stts
->
i_sample_count
);
FREE
(
p_box
->
data
.
p_stts
->
i_sample_delta
);
}
int
MP4_ReadBox_ctts
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1077,7 +1070,13 @@ int MP4_ReadBox_ctts( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
static
inline
int
MP4_ReadLengthDescriptor
(
u8
**
pp_peek
,
s64
*
i_read
)
void
MP4_FreeBox_ctts
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_ctts
->
i_sample_count
);
FREE
(
p_box
->
data
.
p_ctts
->
i_sample_offset
);
}
static
int
MP4_ReadLengthDescriptor
(
u8
**
pp_peek
,
s64
*
i_read
)
{
int
i_b
;
int
i_len
=
0
;
...
...
@@ -1128,6 +1127,8 @@ int MP4_ReadBox_esds( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
es_descriptor
.
psz_URL
=
calloc
(
sizeof
(
char
),
i_len
+
1
);
memcpy
(
es_descriptor
.
psz_URL
,
p_peek
,
i_len
);
es_descriptor
.
psz_URL
[
i_len
]
=
0
;
p_peek
+=
i_len
;
i_read
-=
i_len
;
}
else
{
...
...
@@ -1139,6 +1140,7 @@ int MP4_ReadBox_esds( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
}
MP4_GET1BYTE
(
i_type
);
/* get next type */
}
if
(
i_type
!=
0x04
)
/* MP4DecConfigDescrTag */
{
MP4_READBOX_EXIT
(
1
);
/* rest isn't interesting up to now */
...
...
@@ -1172,6 +1174,12 @@ int MP4_ReadBox_esds( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
#undef es_descriptor
}
void
MP4_FreeBox_esds
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_esds
->
es_descriptor
.
psz_URL
);
FREE
(
p_box
->
data
.
p_esds
->
es_descriptor
.
p_decConfigDescr
);
}
int
MP4_ReadBox_sample_soun
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1350,7 +1358,6 @@ int MP4_ReadBox_sample_mp4v( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
int
MP4_ReadBox_stsd
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
MP4_Box_t
*
p_sample
;
MP4_READBOX_ENTER
(
MP4_Box_data_stsd_t
);
...
...
@@ -1360,66 +1367,8 @@ int MP4_ReadBox_stsd( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_SeekStream
(
p_stream
,
p_box
->
i_pos
+
MP4_BOX_HEADERSIZE
(
p_box
)
+
8
);
MP4_ReadBoxContainerRaw
(
p_stream
,
p_box
);
do
{
p_sample
=
malloc
(
sizeof
(
MP4_Box_t
)
);
if
(
MP4_ReadBoxCommon
(
p_stream
,
p_sample
)
)
{
switch
(
p_sample
->
i_type
)
{
case
(
FOURCC_soun
):
case
(
FOURCC__mp3
):
MP4_ReadBox_sample_soun
(
p_stream
,
p_sample
);
break
;
case
(
FOURCC_mp4a
):
MP4_ReadBox_sample_mp4a
(
p_stream
,
p_sample
);
break
;
case
(
FOURCC_DIVX
):
case
(
FOURCC_SVQ1
):
case
(
FOURCC_vide
):
case
(
FOURCC_3IV1
):
case
(
FOURCC_h263
):
MP4_ReadBox_sample_vide
(
p_stream
,
p_sample
);
break
;
case
(
FOURCC_mp4v
):
MP4_ReadBox_sample_mp4v
(
p_stream
,
p_sample
);
break
;
case
(
FOURCC_mp4s
):
case
(
FOURCC_hint
):
default:
msg_Warn
(
p_stream
->
p_input
,
"Unknown SampleEntry type %c%c%c%c (uncompletetly loaded)"
,
(
p_sample
->
i_type
>>
24
)
&
0xff
,
(
p_sample
->
i_type
>>
16
)
&
0xff
,
(
p_sample
->
i_type
>>
8
)
&
0xff
,
(
p_sample
->
i_type
)
&
0xff
);
break
;
}
MP4_GotoBox
(
p_stream
,
p_sample
);
/* chain this box with the father and the other at same level */
if
(
!
p_box
->
p_first
)
{
p_box
->
p_first
=
p_sample
;
p_box
->
p_last
=
p_sample
;
}
else
{
p_box
->
p_last
->
p_next
=
p_sample
;
p_box
->
p_last
=
p_sample
;
}
p_sample
->
p_father
=
p_box
;
}
else
{
/* free memory */
free
(
p_sample
);
}
}
while
(
MP4_NextBox
(
p_stream
,
p_sample
)
==
1
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
stsd
\"
entry-count %d"
,
p_box
->
data
.
p_stsd
->
i_entry_count
);
...
...
@@ -1462,6 +1411,11 @@ int MP4_ReadBox_stsz( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stsz
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_stsz
->
i_entry_size
);
}
int
MP4_ReadBox_stsc
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1495,6 +1449,13 @@ int MP4_ReadBox_stsc( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stsc
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_stsc
->
i_first_chunk
);
FREE
(
p_box
->
data
.
p_stsc
->
i_samples_per_chunk
);
FREE
(
p_box
->
data
.
p_stsc
->
i_sample_description_index
);
}
int
MP4_ReadBox_stco_co64
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1529,6 +1490,11 @@ int MP4_ReadBox_stco_co64( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stco_co64
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_co64
->
i_chunk_offset
);
}
int
MP4_ReadBox_stss
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1557,6 +1523,11 @@ int MP4_ReadBox_stss( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stss
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_stss
->
i_sample_number
)
}
int
MP4_ReadBox_stsh
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1590,6 +1561,13 @@ int MP4_ReadBox_stsh( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stsh
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_stsh
->
i_shadowed_sample_number
)
FREE
(
p_box
->
data
.
p_stsh
->
i_sync_sample_number
)
}
int
MP4_ReadBox_stdp
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1616,6 +1594,11 @@ int MP4_ReadBox_stdp( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_stdp
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_stdp
->
i_priority
)
}
int
MP4_ReadBox_padb
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1656,6 +1639,14 @@ int MP4_ReadBox_padb( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_padb
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_padb
->
i_reserved1
);
FREE
(
p_box
->
data
.
p_padb
->
i_pad2
);
FREE
(
p_box
->
data
.
p_padb
->
i_reserved2
);
FREE
(
p_box
->
data
.
p_padb
->
i_pad1
);
}
int
MP4_ReadBox_elst
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i
;
...
...
@@ -1707,6 +1698,14 @@ int MP4_ReadBox_elst( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
void
MP4_FreeBox_elst
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_elst
->
i_segment_duration
);
FREE
(
p_box
->
data
.
p_elst
->
i_media_time
);
FREE
(
p_box
->
data
.
p_elst
->
i_media_rate_integer
);
FREE
(
p_box
->
data
.
p_elst
->
i_media_rate_fraction
);
}
int
MP4_ReadBox_cprt
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
int
i_language
;
...
...
@@ -1723,10 +1722,10 @@ int MP4_ReadBox_cprt( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
(
(
i_language
>>
(
(
2
-
i
)
*
5
)
)
&
0x1f
)
+
0x60
;
}
p_peek
+=
2
;
i_read
-=
2
;
MP4_GETSTRING
(
p_box
->
data
.
p_cprt
->
psz_notice
);
MP4_GETSTRING
Z
(
p_box
->
data
.
p_cprt
->
psz_notice
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
cprt
\"
language %c%c%c noti
v
ce %s"
,
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
cprt
\"
language %c%c%c notice %s"
,
p_box
->
data
.
p_cprt
->
i_language
[
0
],
p_box
->
data
.
p_cprt
->
i_language
[
1
],
p_box
->
data
.
p_cprt
->
i_language
[
2
],
...
...
@@ -1736,68 +1735,12 @@ int MP4_ReadBox_cprt( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
MP4_READBOX_EXIT
(
1
);
}
int
MP4_ReadBox_hnti
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
void
MP4_FreeBox_cprt
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
MP4_Box_t
*
p_ref
;
// MP4_Box_t *p_rtp;
if
(
p_box
->
i_size
<
MP4_BOX_HEADERSIZE
(
p_box
)
+
8
)
{
/* container is empty, 8 stand for the first header in this box */
return
(
1
);
}
if
(
!
MP4_SeekStream
(
p_stream
,
p_box
->
i_pos
+
MP4_BOX_HEADERSIZE
(
p_box
)
)
)
{
return
(
0
);
}
do
{
p_ref
=
malloc
(
sizeof
(
MP4_Box_t
)
);
if
(
MP4_ReadBoxCommon
(
p_stream
,
p_ref
)
)
{
switch
(
p_ref
->
i_type
)
{
case
(
FOURCC_rtp
):
default:
msg_Warn
(
p_stream
->
p_input
,
"Unknown moviehintinformation %c%c%c%c (uncompletetly loaded)"
,
(
p_ref
->
i_type
>>
24
)
&
0xff
,
(
p_ref
->
i_type
>>
16
)
&
0xff
,
(
p_ref
->
i_type
>>
8
)
&
0xff
,
(
p_ref
->
i_type
)
&
0xff
);
break
;
}
/* chain this box with the father and the other at same level */
if
(
!
p_box
->
p_first
)
{
p_box
->
p_first
=
p_ref
;
p_box
->
p_last
=
p_ref
;
}
else
{
p_box
->
p_last
->
p_next
=
p_ref
;
p_box
->
p_last
=
p_ref
;
}
p_ref
->
p_father
=
p_box
;
}
else
{
/* free memory */
free
(
p_ref
);
}
}
while
(
MP4_NextBox
(
p_stream
,
p_ref
)
==
1
);
#ifdef MP4_VERBOSE
msg_Dbg
(
p_stream
->
p_input
,
"Read Box:
\"
hnti
\"
"
);
#endif
return
(
1
);
FREE
(
p_box
->
data
.
p_cprt
->
psz_notice
);
}
int
MP4_ReadBox_dcom
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
MP4_READBOX_ENTER
(
MP4_Box_data_dcom_t
);
...
...
@@ -1843,7 +1786,11 @@ int MP4_ReadBox_cmvd( MP4_Stream_t *p_stream, MP4_Box_t *p_box )
#endif
MP4_READBOX_EXIT
(
1
);
}
}
void
MP4_FreeBox_cmvd
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
FREE
(
p_box
->
data
.
p_cmvd
->
p_data
);
}
int
MP4_ReadBox_cmov
(
MP4_Stream_t
*
p_stream
,
MP4_Box_t
*
p_box
)
{
...
...
@@ -1996,46 +1943,73 @@ static struct
{
FOURCC_edts
,
MP4_ReadBoxContainer
,
MP4_FreeBox_Common
},
{
FOURCC_udta
,
MP4_ReadBoxContainer
,
MP4_FreeBox_Common
},
{
FOURCC_nmhd
,
MP4_ReadBoxContainer
,
MP4_FreeBox_Common
},
/* specific sbox */
{
FOURCC_ftyp
,
MP4_ReadBox_ftyp
,
NULL
},
{
FOURCC_
cmov
,
MP4_ReadBox_cmov
,
NULL
},
{
FOURCC_
mvhd
,
MP4_ReadBox_mvhd
,
NULL
},
{
FOURCC_
tkhd
,
MP4_ReadBox_tkhd
,
NULL
},
{
FOURCC_t
ref
,
MP4_ReadBox_tref
,
NULL
},
{
FOURCC_
mdhd
,
MP4_ReadBox_mdhd
,
NULL
},
{
FOURCC_
hdlr
,
MP4_ReadBox_hdlr
,
NULL
},
{
FOURCC_
vmhd
,
MP4_ReadBox_vmhd
,
NULL
},
{
FOURCC_
smhd
,
MP4_ReadBox_smhd
,
NULL
},
{
FOURCC_
hmhd
,
MP4_ReadBox_hmhd
,
NULL
},
{
FOURCC_
url
,
MP4_ReadBox_url
,
NULL
},
{
FOURCC_ur
n
,
MP4_ReadBox_urn
,
NULL
},
{
FOURCC_
dref
,
MP4_ReadBox_dref
,
NULL
},
{
FOURCC_
stts
,
MP4_ReadBox_stts
,
NULL
},
{
FOURCC_
ctts
,
MP4_ReadBox_ctts
,
NULL
},
{
FOURCC_
stsd
,
MP4_ReadBox_stsd
,
NULL
},
{
FOURCC_sts
z
,
MP4_ReadBox_stsz
,
NULL
},
{
FOURCC_sts
c
,
MP4_ReadBox_stsc
,
NULL
},
{
FOURCC_st
co
,
MP4_ReadBox_stco_co64
,
NULL
},
{
FOURCC_
co64
,
MP4_ReadBox_stco_co64
,
NULL
},
{
FOURCC_
stss
,
MP4_ReadBox_stss
,
NULL
},
{
FOURCC_sts
h
,
MP4_ReadBox_stsh
,
NULL
},
{
FOURCC_st
dp
,
MP4_ReadBox_stdp
,
NULL
},
{
FOURCC_
padb
,
MP4_ReadBox_padb
,
NULL
},
{
FOURCC_
elst
,
MP4_ReadBox_elst
,
NULL
},
{
FOURCC_
cprt
,
MP4_ReadBox_cprt
,
NULL
},
{
FOURCC_
hnti
,
MP4_ReadBox_hnti
,
NULL
},
{
FOURCC_esds
,
MP4_ReadBox_esds
,
NULL
},
{
FOURCC_dcom
,
MP4_ReadBox_dcom
,
NULL
},
{
FOURCC_cmvd
,
MP4_ReadBox_cmvd
,
NULL
},
{
FOURCC_hnti
,
MP4_ReadBoxContainer
,
MP4_FreeBox_Common
},
/* specific box */
{
FOURCC_
ftyp
,
MP4_ReadBox_ftyp
,
MP4_FreeBox_ftyp
},
{
FOURCC_
cmov
,
MP4_ReadBox_cmov
,
MP4_FreeBox_Common
},
{
FOURCC_
mvhd
,
MP4_ReadBox_mvhd
,
MP4_FreeBox_Common
},
{
FOURCC_t
khd
,
MP4_ReadBox_tkhd
,
MP4_FreeBox_Common
},
{
FOURCC_
tref
,
MP4_ReadBox_tref
,
MP4_FreeBox_Common
},
{
FOURCC_
mdhd
,
MP4_ReadBox_mdhd
,
MP4_FreeBox_Common
},
{
FOURCC_
hdlr
,
MP4_ReadBox_hdlr
,
MP4_FreeBox_hdlr
},
{
FOURCC_
vmhd
,
MP4_ReadBox_vmhd
,
MP4_FreeBox_Common
},
{
FOURCC_
smhd
,
MP4_ReadBox_smhd
,
MP4_FreeBox_Common
},
{
FOURCC_
hmhd
,
MP4_ReadBox_hmhd
,
MP4_FreeBox_Common
},
{
FOURCC_ur
l
,
MP4_ReadBox_url
,
MP4_FreeBox_url
},
{
FOURCC_
urn
,
MP4_ReadBox_urn
,
MP4_FreeBox_urn
},
{
FOURCC_
dref
,
MP4_ReadBox_dref
,
MP4_FreeBox_Common
},
{
FOURCC_
stts
,
MP4_ReadBox_stts
,
MP4_FreeBox_stts
},
{
FOURCC_
ctts
,
MP4_ReadBox_ctts
,
MP4_FreeBox_ctts
},
{
FOURCC_sts
d
,
MP4_ReadBox_stsd
,
MP4_FreeBox_Common
},
{
FOURCC_sts
z
,
MP4_ReadBox_stsz
,
MP4_FreeBox_stsz
},
{
FOURCC_st
sc
,
MP4_ReadBox_stsc
,
MP4_FreeBox_stsc
},
{
FOURCC_
stco
,
MP4_ReadBox_stco_co64
,
MP4_FreeBox_stco_co64
},
{
FOURCC_
co64
,
MP4_ReadBox_stco_co64
,
MP4_FreeBox_stco_co64
},
{
FOURCC_sts
s
,
MP4_ReadBox_stss
,
MP4_FreeBox_stss
},
{
FOURCC_st
sh
,
MP4_ReadBox_stsh
,
MP4_FreeBox_stsh
},
{
FOURCC_
stdp
,
MP4_ReadBox_stdp
,
MP4_FreeBox_stdp
},
{
FOURCC_
padb
,
MP4_ReadBox_padb
,
MP4_FreeBox_padb
},
{
FOURCC_
elst
,
MP4_ReadBox_elst
,
MP4_FreeBox_elst
},
{
FOURCC_
cprt
,
MP4_ReadBox_cprt
,
MP4_FreeBox_cprt
},
{
FOURCC_esds
,
MP4_ReadBox_esds
,
MP4_FreeBox_esds
},
{
FOURCC_dcom
,
MP4_ReadBox_dcom
,
MP4_FreeBox_Common
},
{
FOURCC_cmvd
,
MP4_ReadBox_cmvd
,
MP4_FreeBox_cmvd
},
/* Nothing to do with this box */
{
FOURCC_mdat
,
MP4_ReadBoxSkip
,
MP4_FreeBox_Common
},
{
FOURCC_skip
,
MP4_ReadBoxSkip
,
MP4_FreeBox_Common
},
{
FOURCC_free
,
MP4_ReadBoxSkip
,
MP4_FreeBox_Common
},
{
FOURCC_wide
,
MP4_ReadBoxSkip
,
MP4_FreeBox_Common
},
/* for codecs */
{
FOURCC_soun
,
MP4_ReadBox_sample_soun
,
MP4_FreeBox_Common
},
{
FOURCC__mp3
,
MP4_ReadBox_sample_soun
,
MP4_FreeBox_Common
},
{
FOURCC_mp4a
,
MP4_ReadBox_sample_mp4a
,
MP4_FreeBox_Common
},
{
FOURCC_vide
,
MP4_ReadBox_sample_vide
,
MP4_FreeBox_Common
},
{
FOURCC_mp4v
,
MP4_ReadBox_sample_mp4v
,
MP4_FreeBox_Common
},
{
FOURCC_SVQ1
,
MP4_ReadBox_sample_vide
,
MP4_FreeBox_Common
},
{
FOURCC_DIVX
,
MP4_ReadBox_sample_vide
,
MP4_FreeBox_Common
},
{
FOURCC_h263
,
MP4_ReadBox_sample_vide
,
MP4_FreeBox_Common
},
{
FOURCC_cvid
,
MP4_ReadBox_sample_vide
,
MP4_FreeBox_Common
},
{
FOURCC_3IV1
,
NULL
,
MP4_FreeBox_Common
},
{
FOURCC_mp4s
,
NULL
,
MP4_FreeBox_Common
},
/* XXX there is 2 box where we could find this entry stbl and tref*/
{
FOURCC_hint
,
NULL
,
MP4_FreeBox_Common
},
/* found in tref box */
{
FOURCC_dpnd
,
NULL
,
NULL
},
{
FOURCC_ipir
,
NULL
,
NULL
},
{
FOURCC_mpod
,
NULL
,
NULL
},
/* found in hnti */
{
FOURCC_rtp
,
NULL
,
NULL
},
/* Last entry */
{
0
,
NULL
,
NULL
}
};
...
...
@@ -2052,7 +2026,7 @@ int MP4_ReadBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box, MP4_Box_t *p_father )
if
(
!
MP4_ReadBoxCommon
(
p_stream
,
p_box
)
)
{
msg_
Err
(
p_stream
->
p_input
,
"Cannot read one box"
);
msg_
Warn
(
p_stream
->
p_input
,
"Cannot read one box"
);
return
(
0
);
}
if
(
!
p_box
->
i_size
)
...
...
@@ -2100,11 +2074,6 @@ int MP4_ReadBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box, MP4_Box_t *p_father )
*****************************************************************************/
void
MP4_FreeBox
(
input_thread_t
*
p_input
,
MP4_Box_t
*
p_box
)
{
#define FREE( p ) \
if( p ) \
{ \
free( p ); \
}
int
i_index
;
MP4_Box_t
*
p_child
;
...
...
@@ -2124,7 +2093,6 @@ void MP4_FreeBox( input_thread_t *p_input, MP4_Box_t *p_box )
p_child
=
p_next
;
}
#if 0
/* Now search function to call */
if
(
p_box
->
data
.
p_data
)
{
...
...
@@ -2138,6 +2106,7 @@ void MP4_FreeBox( input_thread_t *p_input, MP4_Box_t *p_box )
}
if
(
MP4_Box_Function
[
i_index
].
MP4_FreeBox_function
==
NULL
)
{
/* Should not happen */
msg_Warn
(
p_input
,
"cannot free box %c%c%c%c, type unknown"
,
(
p_box
->
i_type
>>
24
)
&
0xff
,
...
...
@@ -2150,125 +2119,13 @@ void MP4_FreeBox( input_thread_t *p_input, MP4_Box_t *p_box )
MP4_Box_Function
[
i_index
].
MP4_FreeBox_function
(
p_input
,
p_box
);
}
free
(
p_box
->
data
.
p_data
);
p_box
->
data
.
p_data
=
NULL
;
}
p_box->data.p_data = NULL;
p_box
->
p_first
=
NULL
;
p_box
->
p_last
=
NULL
;
#endif
if
(
p_box
->
data
.
p_data
)
{
switch
(
p_box
->
i_type
)
{
case
(
FOURCC_ftyp
):
FREE
(
p_box
->
data
.
p_ftyp
->
i_compatible_brands
);
break
;
case
(
FOURCC_hdlr
):
FREE
(
p_box
->
data
.
p_hdlr
->
psz_name
);
break
;
case
(
FOURCC_url
):
FREE
(
p_box
->
data
.
p_url
->
psz_location
);
break
;
case
(
FOURCC_urn
):
FREE
(
p_box
->
data
.
p_urn
->
psz_name
);
FREE
(
p_box
->
data
.
p_urn
->
psz_location
);
break
;
case
(
FOURCC_stts
):
FREE
(
p_box
->
data
.
p_stts
->
i_sample_count
);
FREE
(
p_box
->
data
.
p_stts
->
i_sample_delta
);
break
;
case
(
FOURCC_ctts
):
FREE
(
p_box
->
data
.
p_ctts
->
i_sample_count
);
FREE
(
p_box
->
data
.
p_ctts
->
i_sample_offset
);
break
;
case
(
FOURCC_stsz
):
FREE
(
p_box
->
data
.
p_stsz
->
i_entry_size
);
break
;
case
(
FOURCC_stz2
):
FREE
(
p_box
->
data
.
p_stz2
->
i_entry_size
);
break
;
case
(
FOURCC_stsc
):
FREE
(
p_box
->
data
.
p_stsc
->
i_first_chunk
);
FREE
(
p_box
->
data
.
p_stsc
->
i_samples_per_chunk
);
FREE
(
p_box
->
data
.
p_stsc
->
i_sample_description_index
);
break
;
case
(
FOURCC_stco
):
case
(
FOURCC_co64
):
FREE
(
p_box
->
data
.
p_co64
->
i_chunk_offset
);
break
;
case
(
FOURCC_stss
):
FREE
(
p_box
->
data
.
p_stss
->
i_sample_number
);
break
;
case
(
FOURCC_stsh
):
FREE
(
p_box
->
data
.
p_stsh
->
i_shadowed_sample_number
);
FREE
(
p_box
->
data
.
p_stsh
->
i_sync_sample_number
);
break
;
case
(
FOURCC_stdp
):
FREE
(
p_box
->
data
.
p_stdp
->
i_priority
);
break
;
case
(
FOURCC_padb
):
FREE
(
p_box
->
data
.
p_padb
->
i_reserved1
);
FREE
(
p_box
->
data
.
p_padb
->
i_pad2
);
FREE
(
p_box
->
data
.
p_padb
->
i_reserved2
);
FREE
(
p_box
->
data
.
p_padb
->
i_pad1
);
break
;
case
(
FOURCC_elst
):
FREE
(
p_box
->
data
.
p_elst
->
i_segment_duration
);
FREE
(
p_box
->
data
.
p_elst
->
i_media_time
);
FREE
(
p_box
->
data
.
p_elst
->
i_media_rate_integer
);
FREE
(
p_box
->
data
.
p_elst
->
i_media_rate_fraction
);
break
;
case
(
FOURCC_cprt
):
FREE
(
p_box
->
data
.
p_cprt
->
psz_notice
);
break
;
case
(
FOURCC_cmvd
):
FREE
(
p_box
->
data
.
p_cmvd
->
p_data
);
break
;
case
(
FOURCC_moov
):
/* theses are containers for others boxes */
case
(
FOURCC_trak
):
case
(
FOURCC_mdia
):
case
(
FOURCC_moof
):
case
(
FOURCC_minf
):
case
(
FOURCC_stbl
):
case
(
FOURCC_dinf
):
case
(
FOURCC_edts
):
case
(
FOURCC_udta
):
case
(
FOURCC_nmhd
):
case
(
FOURCC_mvhd
):
/* nothing to free */
case
(
FOURCC_tkhd
):
case
(
FOURCC_mdhd
):
case
(
FOURCC_vmhd
):
case
(
FOURCC_smhd
):
case
(
FOURCC_hmhd
):
case
(
FOURCC_dref
):
case
(
FOURCC_soun
):
case
(
FOURCC_vide
):
case
(
FOURCC_SVQ1
):
case
(
FOURCC_mp4s
):
case
(
FOURCC_mp4a
):
case
(
FOURCC_mp4v
):
case
(
FOURCC_dcom
):
case
(
FOURCC_stsd
):
case
(
FOURCC_cmov
):
case
(
FOURCC_DIVX
):
case
(
FOURCC_3IV1
):
case
(
FOURCC_h263
):
break
;
default:
msg_Warn
(
p_input
,
"cannot free box %c%c%c%c, type unknown"
,
(
p_box
->
i_type
>>
24
)
&
0xff
,
(
p_box
->
i_type
>>
16
)
&
0xff
,
(
p_box
->
i_type
>>
8
)
&
0xff
,
(
p_box
->
i_type
)
&
0xff
);
break
;
}
free
(
p_box
->
data
.
p_data
);
}
p_box
->
data
.
p_data
=
NULL
;
p_box
->
p_first
=
NULL
;
p_box
->
p_last
=
NULL
;
#undef FREE
}
/*****************************************************************************
...
...
@@ -2483,6 +2340,3 @@ MP4_Box_t *MP4_FindNbBox( MP4_Box_t *p_box, u32 i_number )
return
(
p_child
);
}
plugins/mp4/libmp4.h
View file @
ff3794bc
...
...
@@ -2,7 +2,7 @@
* libmp4.h : LibMP4 library for mp4 module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: libmp4.h,v 1.
1 2002/07/17 21:37:27
fenrir Exp $
* $Id: libmp4.h,v 1.
2 2002/07/21 15:13:19
fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -105,6 +105,7 @@
#define FOURCC_3IV1 MP4_FOURCC( '3', 'I', 'V', '1' )
#define FOURCC_h263 MP4_FOURCC( 'h', '2', '6', '3' )
#define FOURCC_DIVX MP4_FOURCC( 'D', 'I', 'V', 'X' )
#define FOURCC_cvid MP4_FOURCC( 'c', 'v', 'i', 'd' )
/*
...
...
plugins/mp4/mp4.h
View file @
ff3794bc
...
...
@@ -2,7 +2,7 @@
* mp4.h : MP4 file input module for vlc
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: mp4.h,v 1.
1 2002/07/17 21:37:27
fenrir Exp $
* $Id: mp4.h,v 1.
2 2002/07/21 15:13:19
fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -213,6 +213,7 @@ static struct
{
FOURCC_SVQ1
,
SVQ1_VIDEO_ES
,
"SVQ1 SampleEntry (Sorenson Video v1"
},
{
FOURCC_mp4v
,
MPEG4_VIDEO_ES
,
"MP4VisualSampleEntry (MPEG-4)"
},
{
FOURCC_3IV1
,
UNKNOWN_ES
,
"3IV1 SampleEntry"
},
{
FOURCC_cvid
,
CINEPAK_VIDEO_ES
,
"cvid SampleEntry (Cinepak Video Codec)"
},
/* Audio codec */
{
FOURCC_soun
,
UNKNOWN_ES
,
"Generic AudioSampleEntry"
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment