Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
6690d4c3
Commit
6690d4c3
authored
Nov 10, 2014
by
Lukasz Marek
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavf/ffm: store/restore private codec context
Signed-off-by:
Lukasz Marek
<
lukasz.m.luki2@gmail.com
>
parent
bee5844d
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
79 additions
and
9 deletions
+79
-9
APIchanges
doc/APIchanges
+3
-0
avformat.h
libavformat/avformat.h
+8
-0
ffmdec.c
libavformat/ffmdec.c
+31
-5
ffmenc.c
libavformat/ffmenc.c
+33
-2
utils.c
libavformat/utils.c
+2
-0
version.h
libavformat/version.h
+2
-2
No files found.
doc/APIchanges
View file @
6690d4c3
...
...
@@ -15,6 +15,9 @@ libavutil: 2014-08-09
API changes, most recent first:
2014-11-16 - xxxxxxx - lavf 56.13.0 - avformat.h
Add AVStream.recommended_encoder_configuration with accessors.
2014-11-16 - xxxxxxx - lavu 54.13.0 - opt.h
Add av_opt_serialize().
...
...
libavformat/avformat.h
View file @
6690d4c3
...
...
@@ -1097,11 +1097,19 @@ typedef struct AVStream {
*/
int
inject_global_side_data
;
/**
* String containing paris of key and values describing recommended encoder configuration.
* Paris are separated by ','.
* Keys are separated from values by '='.
*/
char
*
recommended_encoder_configuration
;
}
AVStream
;
AVRational
av_stream_get_r_frame_rate
(
const
AVStream
*
s
);
void
av_stream_set_r_frame_rate
(
AVStream
*
s
,
AVRational
r
);
struct
AVCodecParserContext
*
av_stream_get_parser
(
const
AVStream
*
s
);
char
*
av_stream_get_recommended_encoder_configuration
(
const
AVStream
*
s
);
void
av_stream_set_recommended_encoder_configuration
(
AVStream
*
s
,
char
*
configuration
);
/**
* Returns the pts of the last muxed packet + its duration
...
...
libavformat/ffmdec.c
View file @
6690d4c3
...
...
@@ -23,6 +23,7 @@
#include "libavutil/intreadwrite.h"
#include "libavutil/intfloat.h"
#include "libavutil/opt.h"
#include "avformat.h"
#include "internal.h"
#include "ffm.h"
...
...
@@ -237,6 +238,8 @@ static int ffm2_read_header(AVFormatContext *s)
AVIOContext
*
pb
=
s
->
pb
;
AVCodecContext
*
codec
;
int
ret
;
int
f_main
=
0
,
f_cprv
,
f_stvi
,
f_stau
;
AVCodec
*
enc
;
ffm
->
packet_size
=
avio_rb32
(
pb
);
if
(
ffm
->
packet_size
!=
FFM_PACKET_SIZE
)
{
...
...
@@ -267,10 +270,15 @@ static int ffm2_read_header(AVFormatContext *s)
switch
(
id
)
{
case
MKBETAG
(
'M'
,
'A'
,
'I'
,
'N'
):
if
(
f_main
++
)
{
ret
=
AVERROR
(
EINVAL
);
goto
fail
;
}
avio_rb32
(
pb
);
/* nb_streams */
avio_rb32
(
pb
);
/* total bitrate */
break
;
case
MKBETAG
(
'C'
,
'O'
,
'M'
,
'M'
):
f_cprv
=
f_stvi
=
f_stau
=
0
;
st
=
avformat_new_stream
(
s
,
NULL
);
if
(
!
st
)
{
ret
=
AVERROR
(
ENOMEM
);
...
...
@@ -291,12 +299,13 @@ static int ffm2_read_header(AVFormatContext *s)
if
(
ff_get_extradata
(
codec
,
pb
,
avio_rb32
(
pb
))
<
0
)
return
AVERROR
(
ENOMEM
);
}
avio_seek
(
pb
,
next
,
SEEK_SET
);
id
=
avio_rb32
(
pb
);
size
=
avio_rb32
(
pb
);
next
=
avio_tell
(
pb
)
+
size
;
switch
(
id
)
{
break
;
//TODO: reident
case
MKBETAG
(
'S'
,
'T'
,
'V'
,
'I'
):
if
(
f_stvi
++
)
{
ret
=
AVERROR
(
EINVAL
);
goto
fail
;
}
codec
->
time_base
.
num
=
avio_rb32
(
pb
);
codec
->
time_base
.
den
=
avio_rb32
(
pb
);
codec
->
width
=
avio_rb16
(
pb
);
...
...
@@ -343,10 +352,27 @@ static int ffm2_read_header(AVFormatContext *s)
codec
->
refs
=
avio_rb32
(
pb
);
break
;
case
MKBETAG
(
'S'
,
'T'
,
'A'
,
'U'
):
if
(
f_stau
++
)
{
ret
=
AVERROR
(
EINVAL
);
goto
fail
;
}
codec
->
sample_rate
=
avio_rb32
(
pb
);
codec
->
channels
=
avio_rl16
(
pb
);
codec
->
frame_size
=
avio_rl16
(
pb
);
break
;
case
MKBETAG
(
'C'
,
'P'
,
'R'
,
'V'
):
if
(
f_cprv
++
)
{
ret
=
AVERROR
(
EINVAL
);
goto
fail
;
}
enc
=
avcodec_find_encoder
(
codec
->
codec_id
);
if
(
enc
&&
enc
->
priv_data_size
&&
enc
->
priv_class
)
{
st
->
recommended_encoder_configuration
=
av_malloc
(
size
+
1
);
if
(
!
st
->
recommended_encoder_configuration
)
{
ret
=
AVERROR
(
ENOMEM
);
goto
fail
;
}
avio_get_str
(
pb
,
size
,
st
->
recommended_encoder_configuration
,
size
+
1
);
}
break
;
}
...
...
libavformat/ffmenc.c
View file @
6690d4c3
...
...
@@ -23,6 +23,7 @@
#include "libavutil/intfloat.h"
#include "libavutil/avassert.h"
#include "libavutil/parseutils.h"
#include "libavutil/opt.h"
#include "avformat.h"
#include "internal.h"
#include "ffm.h"
...
...
@@ -93,6 +94,32 @@ static void write_header_chunk(AVIOContext *pb, AVIOContext *dpb, unsigned id)
av_free
(
dyn_buf
);
}
static
int
ffm_write_header_codec_private_ctx
(
AVIOContext
*
pb
,
AVCodecContext
*
ctx
,
int
type
)
{
AVIOContext
*
tmp
;
char
*
buf
=
NULL
;
int
ret
;
const
AVCodec
*
enc
=
ctx
->
codec
?
ctx
->
codec
:
avcodec_find_encoder
(
ctx
->
codec_id
);
if
(
!
enc
)
return
AVERROR
(
EINVAL
);
if
(
ctx
->
priv_data
&&
enc
->
priv_class
&&
enc
->
priv_data_size
)
{
if
((
ret
=
av_opt_serialize
(
ctx
->
priv_data
,
AV_OPT_FLAG_ENCODING_PARAM
|
type
,
AV_OPT_SERIALIZE_SKIP_DEFAULTS
,
&
buf
,
'='
,
','
))
<
0
)
return
ret
;
if
(
buf
&&
strlen
(
buf
))
{
if
(
avio_open_dyn_buf
(
&
tmp
)
<
0
)
{
av_free
(
buf
);
return
AVERROR
(
ENOMEM
);
}
avio_put_str
(
tmp
,
buf
);
write_header_chunk
(
pb
,
tmp
,
MKBETAG
(
'C'
,
'P'
,
'R'
,
'V'
));
}
av_free
(
buf
);
}
return
0
;
}
static
int
ffm_write_header
(
AVFormatContext
*
s
)
{
FFMContext
*
ffm
=
s
->
priv_data
;
...
...
@@ -100,10 +127,10 @@ static int ffm_write_header(AVFormatContext *s)
AVStream
*
st
;
AVIOContext
*
pb
=
s
->
pb
;
AVCodecContext
*
codec
;
int
bit_rate
,
i
;
int
bit_rate
,
i
,
ret
;
if
(
t
=
av_dict_get
(
s
->
metadata
,
"creation_time"
,
NULL
,
0
))
{
int
ret
=
av_parse_time
(
&
ffm
->
start_time
,
t
->
value
,
0
);
ret
=
av_parse_time
(
&
ffm
->
start_time
,
t
->
value
,
0
);
if
(
ret
<
0
)
return
ret
;
}
...
...
@@ -197,12 +224,16 @@ static int ffm_write_header(AVFormatContext *s)
avio_wb32
(
pb
,
codec
->
max_qdiff
);
avio_wb32
(
pb
,
codec
->
refs
);
write_header_chunk
(
s
->
pb
,
pb
,
MKBETAG
(
'S'
,
'T'
,
'V'
,
'I'
));
if
((
ret
=
ffm_write_header_codec_private_ctx
(
s
->
pb
,
codec
,
AV_OPT_FLAG_VIDEO_PARAM
))
<
0
)
return
ret
;
break
;
case
AVMEDIA_TYPE_AUDIO
:
avio_wb32
(
pb
,
codec
->
sample_rate
);
avio_wl16
(
pb
,
codec
->
channels
);
avio_wl16
(
pb
,
codec
->
frame_size
);
write_header_chunk
(
s
->
pb
,
pb
,
MKBETAG
(
'S'
,
'T'
,
'A'
,
'U'
));
if
((
ret
=
ffm_write_header_codec_private_ctx
(
s
->
pb
,
codec
,
AV_OPT_FLAG_AUDIO_PARAM
))
<
0
)
return
ret
;
break
;
default:
return
-
1
;
...
...
libavformat/utils.c
View file @
6690d4c3
...
...
@@ -103,6 +103,7 @@ static int64_t wrap_timestamp(AVStream *st, int64_t timestamp)
}
MAKE_ACCESSORS
(
AVStream
,
stream
,
AVRational
,
r_frame_rate
)
MAKE_ACCESSORS
(
AVStream
,
stream
,
char
*
,
recommended_encoder_configuration
)
MAKE_ACCESSORS
(
AVFormatContext
,
format
,
AVCodec
*
,
video_codec
)
MAKE_ACCESSORS
(
AVFormatContext
,
format
,
AVCodec
*
,
audio_codec
)
MAKE_ACCESSORS
(
AVFormatContext
,
format
,
AVCodec
*
,
subtitle_codec
)
...
...
@@ -3537,6 +3538,7 @@ void ff_free_stream(AVFormatContext *s, AVStream *st) {
if
(
st
->
info
)
av_freep
(
&
st
->
info
->
duration_error
);
av_freep
(
&
st
->
info
);
av_freep
(
&
st
->
recommended_encoder_configuration
);
av_freep
(
&
s
->
streams
[
--
s
->
nb_streams
]);
}
...
...
libavformat/version.h
View file @
6690d4c3
...
...
@@ -30,8 +30,8 @@
#include "libavutil/version.h"
#define LIBAVFORMAT_VERSION_MAJOR 56
#define LIBAVFORMAT_VERSION_MINOR 1
2
#define LIBAVFORMAT_VERSION_MICRO 10
3
#define LIBAVFORMAT_VERSION_MINOR 1
3
#define LIBAVFORMAT_VERSION_MICRO 10
0
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
...
...
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