Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
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-1.1
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