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
b75c67dc
Commit
b75c67dc
authored
Feb 01, 2012
by
Nicolas George
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavu: add av_bprintf and related.
parent
594a3d63
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
350 additions
and
3 deletions
+350
-3
APIchanges
doc/APIchanges
+3
-0
Makefile
libavutil/Makefile
+4
-2
avutil.h
libavutil/avutil.h
+1
-1
bprint.c
libavutil/bprint.c
+206
-0
bprint.h
libavutil/bprint.h
+136
-0
No files found.
doc/APIchanges
View file @
b75c67dc
...
@@ -13,6 +13,9 @@ libavutil: 2011-04-18
...
@@ -13,6 +13,9 @@ libavutil: 2011-04-18
API changes, most recent first:
API changes, most recent first:
2012-03-21 - xxxxxxx - lavu 51.43.100
Add bprint.h for bprint API.
2012-02-21 - xxxxxxx - lavc 54.4.100
2012-02-21 - xxxxxxx - lavc 54.4.100
Add av_get_pcm_codec() function.
Add av_get_pcm_codec() function.
...
...
libavutil/Makefile
View file @
b75c67dc
...
@@ -10,6 +10,7 @@ HEADERS = adler32.h \
...
@@ -10,6 +10,7 @@ HEADERS = adler32.h \
avstring.h
\
avstring.h
\
avutil.h
\
avutil.h
\
base64.h
\
base64.h
\
bprint.h
\
bswap.h
\
bswap.h
\
common.h
\
common.h
\
cpu.h
\
cpu.h
\
...
@@ -47,6 +48,7 @@ OBJS = adler32.o \
...
@@ -47,6 +48,7 @@ OBJS = adler32.o \
audioconvert.o
\
audioconvert.o
\
avstring.o
\
avstring.o
\
base64.o
\
base64.o
\
bprint.o
\
cpu.o
\
cpu.o
\
crc.o
\
crc.o
\
des.o
\
des.o
\
...
@@ -81,8 +83,8 @@ OBJS-$(ARCH_PPC) += ppc/cpu.o
...
@@ -81,8 +83,8 @@ OBJS-$(ARCH_PPC) += ppc/cpu.o
OBJS-$(ARCH_X86)
+=
x86/cpu.o
OBJS-$(ARCH_X86)
+=
x86/cpu.o
TESTPROGS
=
adler32 aes avstring
base64
cpu crc des
eval
file fifo lfg lls
\
TESTPROGS
=
adler32 aes avstring
base64
bprint cpu crc des
eval
file fifo
\
md5 opt pca parseutils random_seed rational sha tree
lfg lls
md5 opt pca parseutils random_seed rational sha tree
TESTPROGS-$(HAVE_LZO1X_999_COMPRESS)
+=
lzo
TESTPROGS-$(HAVE_LZO1X_999_COMPRESS)
+=
lzo
TOOLS
=
ffeval
TOOLS
=
ffeval
...
...
libavutil/avutil.h
View file @
b75c67dc
...
@@ -153,7 +153,7 @@
...
@@ -153,7 +153,7 @@
*/
*/
#define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MINOR 4
2
#define LIBAVUTIL_VERSION_MINOR 4
3
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
...
...
libavutil/bprint.c
0 → 100644
View file @
b75c67dc
/*
* Copyright (c) 2012 Nicolas George
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include "bprint.h"
#include "common.h"
#include "error.h"
#include "mem.h"
#define av_bprint_room(buf) ((buf)->size - FFMIN((buf)->len, (buf)->size))
#define av_bprint_is_allocated(buf) ((buf)->str != (buf)->reserved_internal_buffer)
static
int
av_bprint_alloc
(
AVBPrint
*
buf
,
unsigned
room
)
{
char
*
old_str
,
*
new_str
;
unsigned
min_size
,
new_size
;
if
(
buf
->
size
==
buf
->
size_max
)
return
AVERROR
(
EIO
);
if
(
!
av_bprint_is_complete
(
buf
))
return
AVERROR_INVALIDDATA
;
/* it is already truncated anyway */
min_size
=
buf
->
len
+
1
+
FFMIN
(
UINT_MAX
-
buf
->
len
-
1
,
room
);
new_size
=
buf
->
size
>
buf
->
size_max
/
2
?
buf
->
size_max
:
buf
->
size
*
2
;
if
(
new_size
<
min_size
)
new_size
=
FFMIN
(
buf
->
size_max
,
min_size
);
old_str
=
av_bprint_is_allocated
(
buf
)
?
buf
->
str
:
NULL
;
new_str
=
av_realloc
(
old_str
,
new_size
);
if
(
!
new_str
)
return
AVERROR
(
ENOMEM
);
if
(
!
old_str
)
memcpy
(
new_str
,
buf
->
str
,
buf
->
len
+
1
);
buf
->
str
=
new_str
;
buf
->
size
=
new_size
;
return
0
;
}
static
void
av_bprint_grow
(
AVBPrint
*
buf
,
unsigned
extra_len
)
{
/* arbitrary margin to avoid small overflows */
extra_len
=
FFMIN
(
extra_len
,
UINT_MAX
-
5
-
buf
->
len
);
buf
->
len
+=
extra_len
;
if
(
buf
->
size
)
buf
->
str
[
FFMIN
(
buf
->
len
,
buf
->
size
-
1
)]
=
0
;
}
void
av_bprint_init
(
AVBPrint
*
buf
,
unsigned
size_init
,
unsigned
size_max
)
{
unsigned
size_auto
=
(
char
*
)
buf
+
sizeof
(
*
buf
)
-
buf
->
reserved_internal_buffer
;
if
(
size_max
==
1
)
size_max
=
size_auto
;
buf
->
str
=
buf
->
reserved_internal_buffer
;
buf
->
len
=
0
;
buf
->
size
=
FFMIN
(
size_auto
,
size_max
);
buf
->
size_max
=
size_max
;
*
buf
->
str
=
0
;
if
(
size_init
>
buf
->
size
)
av_bprint_alloc
(
buf
,
size_init
-
1
);
}
void
av_bprintf
(
AVBPrint
*
buf
,
const
char
*
fmt
,
...)
{
unsigned
room
;
char
*
dst
;
va_list
vl
;
int
extra_len
;
while
(
1
)
{
room
=
av_bprint_room
(
buf
);
dst
=
room
?
buf
->
str
+
buf
->
len
:
NULL
;
va_start
(
vl
,
fmt
);
extra_len
=
vsnprintf
(
dst
,
room
,
fmt
,
vl
);
va_end
(
vl
);
if
(
extra_len
<=
0
)
return
;
if
(
extra_len
<
room
)
break
;
if
(
av_bprint_alloc
(
buf
,
extra_len
))
break
;
}
av_bprint_grow
(
buf
,
extra_len
);
}
void
av_bprint_chars
(
AVBPrint
*
buf
,
char
c
,
unsigned
n
)
{
unsigned
room
,
real_n
;
while
(
1
)
{
room
=
av_bprint_room
(
buf
);
if
(
n
<
room
)
break
;
if
(
av_bprint_alloc
(
buf
,
n
))
break
;
}
if
(
room
)
{
real_n
=
FFMIN
(
n
,
room
-
1
);
memset
(
buf
->
str
+
buf
->
len
,
c
,
real_n
);
}
av_bprint_grow
(
buf
,
n
);
}
int
av_bprint_finalize
(
AVBPrint
*
buf
,
char
**
ret_str
)
{
unsigned
real_size
=
FFMIN
(
buf
->
len
+
1
,
buf
->
size
);
char
*
str
;
int
ret
=
0
;
if
(
ret_str
)
{
if
(
av_bprint_is_allocated
(
buf
))
{
str
=
av_realloc
(
buf
->
str
,
real_size
);
if
(
!
str
)
str
=
buf
->
str
;
buf
->
str
=
NULL
;
}
else
{
str
=
av_malloc
(
real_size
);
if
(
str
)
memcpy
(
str
,
buf
->
str
,
real_size
);
else
ret
=
AVERROR
(
ENOMEM
);
}
*
ret_str
=
str
;
}
else
{
if
(
av_bprint_is_allocated
(
buf
))
av_freep
(
&
buf
->
str
);
}
buf
->
size
=
real_size
;
return
ret
;
}
#ifdef TEST
#undef printf
static
void
bprint_pascal
(
AVBPrint
*
b
,
unsigned
size
)
{
unsigned
p
[
size
+
1
],
i
,
j
;
p
[
0
]
=
1
;
av_bprintf
(
b
,
"%8d
\n
"
,
1
);
for
(
i
=
1
;
i
<=
size
;
i
++
)
{
p
[
i
]
=
1
;
for
(
j
=
i
-
1
;
j
>
0
;
j
--
)
p
[
j
]
=
p
[
j
]
+
p
[
j
-
1
];
for
(
j
=
0
;
j
<=
i
;
j
++
)
av_bprintf
(
b
,
"%8d"
,
p
[
j
]);
av_bprintf
(
b
,
"
\n
"
);
}
}
int
main
(
void
)
{
AVBPrint
b
;
av_bprint_init
(
&
b
,
0
,
-
1
);
bprint_pascal
(
&
b
,
5
);
printf
(
"Short text in unlimited buffer: %zu/%u
\n
"
,
strlen
(
b
.
str
),
b
.
len
);
printf
(
"%s
\n
"
,
b
.
str
);
av_bprint_finalize
(
&
b
,
NULL
);
av_bprint_init
(
&
b
,
0
,
-
1
);
bprint_pascal
(
&
b
,
25
);
printf
(
"Long text in unlimited buffer: %zu/%u
\n
"
,
strlen
(
b
.
str
),
b
.
len
);
av_bprint_finalize
(
&
b
,
NULL
);
av_bprint_init
(
&
b
,
0
,
2048
);
bprint_pascal
(
&
b
,
25
);
printf
(
"Long text in limited buffer: %zu/%u
\n
"
,
strlen
(
b
.
str
),
b
.
len
);
av_bprint_finalize
(
&
b
,
NULL
);
av_bprint_init
(
&
b
,
0
,
1
);
bprint_pascal
(
&
b
,
5
);
printf
(
"Short text in automatic buffer: %zu/%u
\n
"
,
strlen
(
b
.
str
),
b
.
len
);
av_bprint_init
(
&
b
,
0
,
1
);
bprint_pascal
(
&
b
,
25
);
printf
(
"Long text in automatic buffer: %zu/%u
\n
"
,
strlen
(
b
.
str
),
b
.
len
);
/* Note that the size of the automatic buffer is arch-dependant. */
av_bprint_init
(
&
b
,
0
,
0
);
bprint_pascal
(
&
b
,
25
);
printf
(
"Long text count only buffer: %zu/%u
\n
"
,
strlen
(
b
.
str
),
b
.
len
);
return
0
;
}
#endif
libavutil/bprint.h
0 → 100644
View file @
b75c67dc
/*
* Copyright (c) 2012 Nicolas George
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVUTIL_BPRINT_H
#define AVUTIL_BPRINT_H
#include "attributes.h"
/**
* Define a structure with extra padding to a fixed size
* This helps ensuring binary compatibility with future versions.
*/
#define FF_PAD_STRUCTURE(size, ...) \
__VA_ARGS__ \
char reserved_padding[size - sizeof(struct { __VA_ARGS__ })];
/**
* Buffer to print data progressively
*
* The string buffer grows as necessary and is always 0-terminated.
* The content of the string is never accessed, and thus is
* encoding-agnostic and can even hold binary data.
*
* Small buffers are kept in the structure itself, and thus require no
* memory allocation at all (unless the contents of the buffer is needed
* after the structure goes out of scope). This is almost as lightweight as
* declaring a local "char buf[512]".
*
* The length of the string can go beyond the allocated size: the buffer is
* then truncated, but the functions still keep account of the actual total
* length.
*
* In other words, buf->len can be greater than buf->size and records the
* total length of what would have been to the buffer if there had been
* enough memory.
*
* Append operations do not need to be tested for failure: if a memory
* allocation fails, data stop being appended to the buffer, but the length
* is still updated. This situation can be tested with
* av_bprint_is_complete().
*
* The size_max field determines several possible behaviours:
*
* size_max = -1 (= UINT_MAX) or any large value will let the buffer be
* reallocated as necessary, with an amortized linear cost.
*
* size_max = 0 prevents writing anything to the buffer: only the total
* length is computed. The write operations can then possibly be repeated in
* a buffer with exactly the necessary size
* (using size_init = size_max = len + 1).
*
* size_max = 1 is automatically replaced by the exact size available in the
* structure itself, thus ensuring no dynamic memory allocation. The
* internal buffer is large enough to hold a reasonable paragraph of text,
* such as the current paragraph.
*/
typedef
struct
AVBPrint
{
FF_PAD_STRUCTURE
(
1024
,
char
*
str
;
/** string so far */
unsigned
len
;
/** length so far */
unsigned
size
;
/** allocated memory */
unsigned
size_max
;
/** maximum allocated memory */
char
reserved_internal_buffer
[
1
];
)
}
AVBPrint
;
/**
* Init a print buffer.
*
* @param buf buffer to init
* @param size_init initial size (including the final 0)
* @param size_max maximum size;
* 0 means do not write anything, just count the length;
* 1 is replaced by the maximum value for automatic storage
*/
void
av_bprint_init
(
AVBPrint
*
buf
,
unsigned
size_init
,
unsigned
size_max
);
/**
* Convenience macros for special values for size_max.
*/
#define AV_BPRINT_SIZE_UNLIMITED ((unsigned)-1)
#define AV_BPRINT_SIZE_AUTOMATIC 1
#define AV_BPRINT_SIZE_COUNT_ONLY 0
/**
* Append a formated string to a print buffer.
*/
void
av_bprintf
(
AVBPrint
*
buf
,
const
char
*
fmt
,
...)
av_printf_format
(
2
,
3
);
/**
* Append char c n times to a print buffer.
*/
void
av_bprint_chars
(
AVBPrint
*
buf
,
char
c
,
unsigned
n
);
/**
* Test if the print buffer is complete (not truncated).
*
* It may have been truncated due to a memory allocation failure
* or the size_max limit (compare size and size_max if necessary).
*/
static
inline
int
av_bprint_is_complete
(
AVBPrint
*
buf
)
{
return
buf
->
len
<
buf
->
size
;
}
/**
* Finalize a print buffer.
*
* The print buffer can no longer be used afterwards,
* but the len and size fields are still valid.
*
* @arg[out] ret_str if not NULL, used to return a permanent copy of the
* buffer contents, or NULL if memory allocation fails;
* if NULL, the buffer is discarded and freed
* @return 0 for success or error code (probably AVERROR(ENOMEM))
*/
int
av_bprint_finalize
(
AVBPrint
*
buf
,
char
**
ret_str
);
#endif
/* AVUTIL_BPRINT_H */
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