Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ec3f70ddb | |||
| e70ab7c1f5 |
@@ -1,6 +1,9 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version <next>
|
||||
|
||||
|
||||
version 2.2:
|
||||
|
||||
- HNM version 4 demuxer and video decoder
|
||||
|
||||
@@ -3661,10 +3661,6 @@ case "$arch" in
|
||||
check_64bit ppc ppc64 'sizeof(void *) > 4'
|
||||
spic=$shared
|
||||
;;
|
||||
s390)
|
||||
check_64bit s390 s390x 'sizeof(void *) > 4'
|
||||
spic=$shared
|
||||
;;
|
||||
sparc)
|
||||
check_64bit sparc sparc64 'sizeof(void *) > 4'
|
||||
spic=$shared
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 2.2-rc2
|
||||
PROJECT_NUMBER =
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
||||
@@ -162,27 +162,6 @@ libzvbi is licensed under the GNU General Public License Version 2 or later
|
||||
you must upgrade FFmpeg's license to GPL in order to use it.
|
||||
@end float
|
||||
|
||||
@section AviSynth
|
||||
|
||||
FFmpeg can read AviSynth scripts as input. To enable support, pass
|
||||
@code{--enable-avisynth} to configure. The correct headers are
|
||||
included in compat/avisynth/, which allows the user to enable support
|
||||
without needing to search for these headers themselves.
|
||||
|
||||
For Windows, supported AviSynth variants are
|
||||
@url{http://avisynth.nl, AviSynth 2.5 or 2.6} for 32-bit builds and
|
||||
@url{http://avs-plus.net, AviSynth+ 0.1} for 32-bit and 64-bit builds.
|
||||
|
||||
For Linux and OS X, the supported AviSynth variant is
|
||||
@url{https://github.com/avxsynth/avxsynth, AvxSynth}.
|
||||
|
||||
@float NOTE
|
||||
AviSynth and AvxSynth are loaded dynamically. Distributors can build FFmpeg
|
||||
with @code{--enable-avisynth}, and the binaries will work regardless of the
|
||||
end user having AviSynth or AvxSynth installed - they'll only need to be
|
||||
installed to use AviSynth scripts (obviously).
|
||||
@end float
|
||||
|
||||
|
||||
@chapter Supported File Formats, Codecs or Features
|
||||
|
||||
|
||||
+2
-3
@@ -327,11 +327,10 @@ die "No filename or title\n" unless defined $fn && defined $tl;
|
||||
$chapters{NAME} = "$fn \- $tl\n";
|
||||
$chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
|
||||
|
||||
# always use utf8
|
||||
print "=encoding utf8\n\n";
|
||||
|
||||
unshift @chapters_sequence, "NAME";
|
||||
for $chapter (@chapters_sequence) {
|
||||
# always use utf8
|
||||
print "=encoding utf8\n";
|
||||
if (exists $chapters{$chapter}) {
|
||||
$head = uc($chapter);
|
||||
print "=head1 $head\n\n";
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
|
||||
}
|
||||
}
|
||||
|
||||
if (avctx->bits_per_coded_sample <= 8) {
|
||||
if ((avctx->bits_per_coded_sample & 0x1f) <= 8) {
|
||||
const uint8_t *pal = av_packet_get_side_data(avpkt,
|
||||
AV_PKT_DATA_PALETTE,
|
||||
NULL);
|
||||
|
||||
@@ -144,11 +144,10 @@ function ff_put_pixels8_y2_armv6, export=1
|
||||
eor r7, r5, r7
|
||||
uadd8 r10, r10, r6
|
||||
and r7, r7, r12
|
||||
ldrc_pre ne, r6, r1, r2
|
||||
ldr_pre r6, r1, r2
|
||||
uadd8 r11, r11, r7
|
||||
strd_post r8, r9, r0, r2
|
||||
it ne
|
||||
ldrne r7, [r1, #4]
|
||||
ldr r7, [r1, #4]
|
||||
strd_post r10, r11, r0, r2
|
||||
bne 1b
|
||||
|
||||
@@ -197,10 +196,9 @@ function ff_put_pixels8_y2_no_rnd_armv6, export=1
|
||||
uhadd8 r9, r5, r7
|
||||
ldr r5, [r1, #4]
|
||||
uhadd8 r12, r4, r6
|
||||
ldrc_pre ne, r6, r1, r2
|
||||
ldr_pre r6, r1, r2
|
||||
uhadd8 r14, r5, r7
|
||||
it ne
|
||||
ldrne r7, [r1, #4]
|
||||
ldr r7, [r1, #4]
|
||||
stm r0, {r8,r9}
|
||||
add r0, r0, r2
|
||||
stm r0, {r12,r14}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
void ff_vp3_idct_put_neon(uint8_t *dest, int line_size, int16_t *data);
|
||||
void ff_vp3_idct_add_neon(uint8_t *dest, int line_size, int16_t *data);
|
||||
void ff_vp3_idct_dc_add_neon(uint8_t *dest, int line_size, int16_t *data);
|
||||
void ff_vp3_idct_dc_add_neon(uint8_t *dest, int line_size, const int16_t *data);
|
||||
|
||||
void ff_vp3_v_loop_filter_neon(uint8_t *, int, int *);
|
||||
void ff_vp3_h_loop_filter_neon(uint8_t *, int, int *);
|
||||
|
||||
@@ -166,10 +166,6 @@ static int fic_decode_frame(AVCodecContext *avctx, void *data,
|
||||
if (memcmp(src, fic_header, 7))
|
||||
av_log(avctx, AV_LOG_WARNING, "Invalid FIC Header.\n");
|
||||
|
||||
/* Is it a skip frame? */
|
||||
if (src[17])
|
||||
goto skip;
|
||||
|
||||
nslices = src[13];
|
||||
if (!nslices) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Zero slices found.\n");
|
||||
@@ -250,7 +246,6 @@ static int fic_decode_frame(AVCodecContext *avctx, void *data,
|
||||
NULL, nslices, sizeof(ctx->slice_data[0])) < 0)
|
||||
return ret;
|
||||
|
||||
skip:
|
||||
*got_frame = 1;
|
||||
if ((ret = av_frame_ref(data, ctx->frame)) < 0)
|
||||
return ret;
|
||||
|
||||
@@ -214,18 +214,6 @@ static inline int get_se_golomb(GetBitContext *gb)
|
||||
}
|
||||
}
|
||||
|
||||
static inline int get_se_golomb_long(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf = get_ue_golomb_long(gb);
|
||||
|
||||
if (buf & 1)
|
||||
buf = -(buf >> 1);
|
||||
else
|
||||
buf = (buf >> 1);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
static inline int svq3_get_se_golomb(GetBitContext *gb)
|
||||
{
|
||||
unsigned int buf;
|
||||
|
||||
+11
-5
@@ -359,11 +359,17 @@ int ff_h264_decode_seq_parameter_set(H264Context *h)
|
||||
sps->scaling_matrix_present = 0;
|
||||
sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED
|
||||
|
||||
if (sps->profile_idc == 100 || sps->profile_idc == 110 ||
|
||||
sps->profile_idc == 122 || sps->profile_idc == 244 ||
|
||||
sps->profile_idc == 44 || sps->profile_idc == 83 ||
|
||||
sps->profile_idc == 86 || sps->profile_idc == 118 ||
|
||||
sps->profile_idc == 128 || sps->profile_idc == 144) {
|
||||
if (sps->profile_idc == 100 || // High profile
|
||||
sps->profile_idc == 110 || // High10 profile
|
||||
sps->profile_idc == 122 || // High422 profile
|
||||
sps->profile_idc == 244 || // High444 Predictive profile
|
||||
sps->profile_idc == 44 || // Cavlc444 profile
|
||||
sps->profile_idc == 83 || // Scalable Constrained High profile (SVC)
|
||||
sps->profile_idc == 86 || // Scalable High Intra profile (SVC)
|
||||
sps->profile_idc == 118 || // Stereo High profile (MVC)
|
||||
sps->profile_idc == 128 || // Multiview High profile (MVC)
|
||||
sps->profile_idc == 138 || // Multiview Depth High profile (MVCD)
|
||||
sps->profile_idc == 144) { // old High444 profile
|
||||
sps->chroma_format_idc = get_ue_golomb_31(&h->gb);
|
||||
if (sps->chroma_format_idc > 3U) {
|
||||
avpriv_request_sample(h->avctx, "chroma_format_idc %u",
|
||||
|
||||
+1
-1
@@ -283,7 +283,7 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
|
||||
static int set_sps(HEVCContext *s, const HEVCSPS *sps)
|
||||
{
|
||||
int ret;
|
||||
unsigned int num = 0, den = 0;
|
||||
unsigned num = 0, den = 0;
|
||||
|
||||
pic_arrays_free(s);
|
||||
ret = pic_arrays_init(s, sps);
|
||||
|
||||
+1
-1
@@ -461,7 +461,7 @@ typedef struct HEVCSPS {
|
||||
} HEVCSPS;
|
||||
|
||||
typedef struct HEVCPPS {
|
||||
unsigned int sps_id; ///< seq_parameter_set_id
|
||||
unsigned sps_id; ///< seq_parameter_set_id
|
||||
|
||||
uint8_t sign_data_hiding_flag;
|
||||
|
||||
|
||||
@@ -611,8 +611,8 @@ int ff_hevc_decode_nal_sps(HEVCContext *s)
|
||||
{
|
||||
const AVPixFmtDescriptor *desc;
|
||||
GetBitContext *gb = &s->HEVClc->gb;
|
||||
int ret = 0;
|
||||
unsigned int sps_id = 0;
|
||||
int ret = 0;
|
||||
int sps_id = 0;
|
||||
int log2_diff_max_min_transform_block_size;
|
||||
int bit_depth_chroma, start, vui_present, sublayer_ordering_info;
|
||||
int i;
|
||||
@@ -993,8 +993,8 @@ int ff_hevc_decode_nal_pps(HEVCContext *s)
|
||||
int pic_area_in_ctbs, pic_area_in_min_cbs, pic_area_in_min_tbs;
|
||||
int log2_diff_ctb_min_tb_size;
|
||||
int i, j, x, y, ctb_addr_rs, tile_id;
|
||||
int ret = 0;
|
||||
unsigned int pps_id = 0;
|
||||
int ret = 0;
|
||||
int pps_id = 0;
|
||||
|
||||
AVBufferRef *pps_buf;
|
||||
HEVCPPS *pps = av_mallocz(sizeof(*pps));
|
||||
|
||||
@@ -190,7 +190,7 @@ static av_cold int libx265_encode_init(AVCodecContext *avctx)
|
||||
for (i = 0; i < nnal; i++)
|
||||
ctx->header_size += nal[i].sizeBytes;
|
||||
|
||||
ctx->header = av_malloc(ctx->header_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
ctx->header = av_malloc(ctx->header_size);
|
||||
if (!ctx->header) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Cannot allocate HEVC header of size %d.\n", ctx->header_size);
|
||||
@@ -204,13 +204,6 @@ static av_cold int libx265_encode_init(AVCodecContext *avctx)
|
||||
buf += nal[i].sizeBytes;
|
||||
}
|
||||
|
||||
if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) {
|
||||
avctx->extradata_size = ctx->header_size;
|
||||
avctx->extradata = ctx->header;
|
||||
ctx->header_size = 0;
|
||||
ctx->header = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ static av_cold int msrle_decode_init(AVCodecContext *avctx)
|
||||
|
||||
s->avctx = avctx;
|
||||
|
||||
switch (avctx->bits_per_coded_sample) {
|
||||
switch (avctx->bits_per_coded_sample & 0x1f) {
|
||||
case 1:
|
||||
avctx->pix_fmt = AV_PIX_FMT_MONOWHITE;
|
||||
break;
|
||||
|
||||
@@ -727,6 +727,8 @@ void ff_thread_flush(AVCodecContext *avctx)
|
||||
if (fctx->prev_thread) {
|
||||
if (fctx->prev_thread != &fctx->threads[0])
|
||||
update_context_from_thread(fctx->threads[0].avctx, fctx->prev_thread->avctx, 0);
|
||||
if (avctx->codec->flush)
|
||||
avctx->codec->flush(fctx->threads[0].avctx);
|
||||
}
|
||||
|
||||
fctx->next_decoding = fctx->next_finished = 0;
|
||||
@@ -739,9 +741,6 @@ void ff_thread_flush(AVCodecContext *avctx)
|
||||
av_frame_unref(p->frame);
|
||||
|
||||
release_delayed_buffers(p);
|
||||
|
||||
if (avctx->codec->flush)
|
||||
avctx->codec->flush(p->avctx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -109,7 +109,7 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx)
|
||||
if ( avctx->codec_tag == MKTAG('r','a','w',' ')
|
||||
|| avctx->codec_tag == MKTAG('N','O','1','6'))
|
||||
avctx->pix_fmt = avpriv_find_pix_fmt(pix_fmt_bps_mov,
|
||||
avctx->bits_per_coded_sample);
|
||||
avctx->bits_per_coded_sample & 0x1f);
|
||||
else if (avctx->codec_tag == MKTAG('W', 'R', 'A', 'W'))
|
||||
avctx->pix_fmt = avpriv_find_pix_fmt(pix_fmt_bps_avi,
|
||||
avctx->bits_per_coded_sample);
|
||||
@@ -135,7 +135,7 @@ static av_cold int raw_init_decoder(AVCodecContext *avctx)
|
||||
memset(context->palette->data, 0, AVPALETTE_SIZE);
|
||||
}
|
||||
|
||||
if ((avctx->bits_per_coded_sample == 4 || avctx->bits_per_coded_sample == 2) &&
|
||||
if (((avctx->bits_per_coded_sample & 0x1f) == 4 || (avctx->bits_per_coded_sample & 0x1f) == 2) &&
|
||||
avctx->pix_fmt == AV_PIX_FMT_PAL8 &&
|
||||
(!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' '))) {
|
||||
context->is_2_4_bpp = 1;
|
||||
@@ -209,14 +209,14 @@ static int raw_decode(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
int i;
|
||||
uint8_t *dst = frame->buf[0]->data;
|
||||
buf_size = context->frame_size - AVPALETTE_SIZE;
|
||||
if (avctx->bits_per_coded_sample == 4) {
|
||||
if ((avctx->bits_per_coded_sample & 0x1f) == 4) {
|
||||
for (i = 0; 2 * i + 1 < buf_size && i<avpkt->size; i++) {
|
||||
dst[2 * i + 0] = buf[i] >> 4;
|
||||
dst[2 * i + 1] = buf[i] & 15;
|
||||
}
|
||||
linesize_align = 8;
|
||||
} else {
|
||||
av_assert0(avctx->bits_per_coded_sample == 2);
|
||||
av_assert0((avctx->bits_per_coded_sample & 0x1f) == 2);
|
||||
for (i = 0; 4 * i + 3 < buf_size && i<avpkt->size; i++) {
|
||||
dst[4 * i + 0] = buf[i] >> 6;
|
||||
dst[4 * i + 1] = buf[i] >> 4 & 3;
|
||||
|
||||
+1
-4
@@ -730,10 +730,7 @@ static int rv10_decode_frame(AVCodecContext *avctx,
|
||||
offset + FFMAX(size, size2) > buf_size)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
if ((ret = rv10_decode_packet(avctx, buf + offset, size, size2)) < 0)
|
||||
return ret;
|
||||
|
||||
if (ret > 8 * size)
|
||||
if (rv10_decode_packet(avctx, buf + offset, size, size2) > 8 * size)
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
@@ -1058,11 +1058,11 @@ static int push_samples(ATempoContext *atempo,
|
||||
outlink->time_base);
|
||||
|
||||
ret = ff_filter_frame(outlink, atempo->dst_buffer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
atempo->dst_buffer = NULL;
|
||||
atempo->dst = NULL;
|
||||
atempo->dst_end = NULL;
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
atempo->nsamples_out += n_out;
|
||||
return 0;
|
||||
|
||||
+10
-14
@@ -81,7 +81,7 @@ static void *load_sym(AVFilterContext *ctx, const char *sym_name)
|
||||
Frei0rContext *s = ctx->priv;
|
||||
void *sym = dlsym(s->dl_handle, sym_name);
|
||||
if (!sym)
|
||||
av_log(ctx, AV_LOG_ERROR, "Could not find symbol '%s' in loaded module.\n", sym_name);
|
||||
av_log(ctx, AV_LOG_ERROR, "Could not find symbol '%s' in loaded module\n", sym_name);
|
||||
return sym;
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ static int set_param(AVFilterContext *ctx, f0r_param_info_t info, int index, cha
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
av_log(ctx, AV_LOG_ERROR, "Invalid value '%s' for parameter '%s'.\n",
|
||||
av_log(ctx, AV_LOG_ERROR, "Invalid value '%s' for parameter '%s'\n",
|
||||
param, info.name);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
@@ -202,11 +202,11 @@ static int set_params(AVFilterContext *ctx, const char *params)
|
||||
default: /* F0R_PARAM_STRING */
|
||||
v = s;
|
||||
s->get_param_value(s->instance, v, i);
|
||||
av_log(ctx, AV_LOG_DEBUG, "'%s'", s);
|
||||
av_log(ctx, AV_LOG_DEBUG, "'%s'\n", s);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
av_log(ctx, AV_LOG_VERBOSE, ".\n");
|
||||
av_log(ctx, AV_LOG_VERBOSE, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -217,7 +217,7 @@ static int load_path(AVFilterContext *ctx, void **handle_ptr, const char *prefix
|
||||
char *path = av_asprintf("%s%s%s", prefix, name, SLIBSUF);
|
||||
if (!path)
|
||||
return AVERROR(ENOMEM);
|
||||
av_log(ctx, AV_LOG_DEBUG, "Looking for frei0r effect in '%s'.\n", path);
|
||||
av_log(ctx, AV_LOG_DEBUG, "Looking for frei0r effect in '%s'\n", path);
|
||||
*handle_ptr = dlopen(path, RTLD_NOW|RTLD_LOCAL);
|
||||
av_free(path);
|
||||
return 0;
|
||||
@@ -288,7 +288,7 @@ static av_cold int frei0r_init(AVFilterContext *ctx,
|
||||
return ret;
|
||||
}
|
||||
if (!s->dl_handle) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Could not find module '%s'.\n", dl_name);
|
||||
av_log(ctx, AV_LOG_ERROR, "Could not find module '%s'\n", dl_name);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
@@ -304,7 +304,7 @@ static av_cold int frei0r_init(AVFilterContext *ctx,
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
if (f0r_init() < 0) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Could not init the frei0r module.\n");
|
||||
av_log(ctx, AV_LOG_ERROR, "Could not init the frei0r module\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
@@ -312,7 +312,7 @@ static av_cold int frei0r_init(AVFilterContext *ctx,
|
||||
pi = &s->plugin_info;
|
||||
if (pi->plugin_type != type) {
|
||||
av_log(ctx, AV_LOG_ERROR,
|
||||
"Invalid type '%s' for this plugin\n",
|
||||
"Invalid type '%s' for the plugin\n",
|
||||
pi->plugin_type == F0R_PLUGIN_TYPE_FILTER ? "filter" :
|
||||
pi->plugin_type == F0R_PLUGIN_TYPE_SOURCE ? "source" :
|
||||
pi->plugin_type == F0R_PLUGIN_TYPE_MIXER2 ? "mixer2" :
|
||||
@@ -359,7 +359,7 @@ static int config_input_props(AVFilterLink *inlink)
|
||||
if (s->destruct && s->instance)
|
||||
s->destruct(s->instance);
|
||||
if (!(s->instance = s->construct(inlink->w, inlink->h))) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Impossible to load frei0r instance.\n");
|
||||
av_log(ctx, AV_LOG_ERROR, "Impossible to load frei0r instance\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
@@ -476,11 +476,7 @@ static int source_config_props(AVFilterLink *outlink)
|
||||
if (s->destruct && s->instance)
|
||||
s->destruct(s->instance);
|
||||
if (!(s->instance = s->construct(outlink->w, outlink->h))) {
|
||||
av_log(ctx, AV_LOG_ERROR, "Impossible to load frei0r instance.\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (!s->params) {
|
||||
av_log(ctx, AV_LOG_ERROR, "frei0r filter parameters not set.\n");
|
||||
av_log(ctx, AV_LOG_ERROR, "Impossible to load frei0r instance\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ OBJS-$(CONFIG_RTPDEC) += rdt.o \
|
||||
rtpdec_xiph.o \
|
||||
srtp.o
|
||||
OBJS-$(CONFIG_RTPENC_CHAIN) += rtpenc_chain.o rtp.o
|
||||
OBJS-$(CONFIG_SHARED) += log2_tab.o golomb_tab.o
|
||||
OBJS-$(CONFIG_SHARED) += log2_tab.o
|
||||
|
||||
# muxers/demuxers
|
||||
OBJS-$(CONFIG_A64_MUXER) += a64.o rawenc.o
|
||||
@@ -217,7 +217,7 @@ OBJS-$(CONFIG_MM_DEMUXER) += mm.o
|
||||
OBJS-$(CONFIG_MMF_DEMUXER) += mmf.o
|
||||
OBJS-$(CONFIG_MMF_MUXER) += mmf.o rawenc.o
|
||||
OBJS-$(CONFIG_MOV_DEMUXER) += mov.o isom.o mov_chan.o
|
||||
OBJS-$(CONFIG_MOV_MUXER) += movenc.o isom.o avc.o hevc.o \
|
||||
OBJS-$(CONFIG_MOV_MUXER) += movenc.o isom.o avc.o \
|
||||
movenchint.o mov_chan.o rtp.o
|
||||
OBJS-$(CONFIG_MP2_MUXER) += mp3enc.o rawenc.o id3v2enc.o
|
||||
OBJS-$(CONFIG_MP3_DEMUXER) += mp3dec.o
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "libavcodec/golomb.c"
|
||||
-1140
File diff suppressed because it is too large
Load Diff
@@ -1,98 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2014 Tim Walker <tdskywalker@gmail.com>
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* internal header for HEVC (de)muxer utilities
|
||||
*/
|
||||
|
||||
#ifndef AVFORMAT_HEVC_H
|
||||
#define AVFORMAT_HEVC_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "avio.h"
|
||||
|
||||
/**
|
||||
* Writes Annex B formatted HEVC NAL units to the provided AVIOContext.
|
||||
*
|
||||
* The NAL units are converted to an MP4-compatible format (start code prefixes
|
||||
* are replaced by 4-byte size fields, as per ISO/IEC 14496-15).
|
||||
*
|
||||
* If filter_ps is non-zero, any HEVC parameter sets found in the input will be
|
||||
* discarded, and *ps_count will be set to the number of discarded PS NAL units.
|
||||
*
|
||||
* @param pb address of the AVIOContext where the data shall be written
|
||||
* @param buf_in address of the buffer holding the input data
|
||||
* @param size size (in bytes) of the input buffer
|
||||
* @param filter_ps whether to write parameter set NAL units to the output (0)
|
||||
* or to discard them (non-zero)
|
||||
* @param ps_count address of the variable where the number of discarded
|
||||
* parameter set NAL units shall be written, may be NULL
|
||||
* @return the amount (in bytes) of data written in case of success, a negative
|
||||
* value corresponding to an AVERROR code in case of failure
|
||||
*/
|
||||
int ff_hevc_annexb2mp4(AVIOContext *pb, const uint8_t *buf_in,
|
||||
int size, int filter_ps, int *ps_count);
|
||||
|
||||
/**
|
||||
* Writes Annex B formatted HEVC NAL units to a data buffer.
|
||||
*
|
||||
* The NAL units are converted to an MP4-compatible format (start code prefixes
|
||||
* are replaced by 4-byte size fields, as per ISO/IEC 14496-15).
|
||||
*
|
||||
* If filter_ps is non-zero, any HEVC parameter sets found in the input will be
|
||||
* discarded, and *ps_count will be set to the number of discarded PS NAL units.
|
||||
*
|
||||
* On output, *size holds the size (in bytes) of the output data buffer.
|
||||
*
|
||||
* @param buf_in address of the buffer holding the input data
|
||||
* @param size address of the variable holding the size (in bytes) of the input
|
||||
* buffer (on input) and of the output buffer (on output)
|
||||
* @param buf_out address of the variable holding the address of the output
|
||||
* buffer
|
||||
* @param filter_ps whether to write parameter set NAL units to the output (0)
|
||||
* or to discard them (non-zero)
|
||||
* @param ps_count address of the variable where the number of discarded
|
||||
* parameter set NAL units shall be written, may be NULL
|
||||
* @return the amount (in bytes) of data written in case of success, a negative
|
||||
* value corresponding to an AVERROR code in case of failure
|
||||
*/
|
||||
int ff_hevc_annexb2mp4_buf(const uint8_t *buf_in, uint8_t **buf_out,
|
||||
int *size, int filter_ps, int *ps_count);
|
||||
|
||||
/**
|
||||
* Writes HEVC extradata (parameter sets, declarative SEI NAL units) to the
|
||||
* provided AVIOContext.
|
||||
*
|
||||
* If the extradata is Annex B format, it gets converted to hvcC format before
|
||||
* writing.
|
||||
*
|
||||
* @param pb address of the AVIOContext where the hvcC shall be written
|
||||
* @param data address of the buffer holding the data needed to write the hvcC
|
||||
* @param size size (in bytes) of the data buffer
|
||||
* @param ps_array_completeness whether all parameter sets are in the hvcC (1)
|
||||
* or there may be additional parameter sets in the bitstream (0)
|
||||
* @return >=0 in case of success, a negative value corresponding to an AVERROR
|
||||
* code in case of failure
|
||||
*/
|
||||
int ff_isom_write_hvcc(AVIOContext *pb, const uint8_t *data,
|
||||
int size, int ps_array_completeness);
|
||||
|
||||
#endif /* AVFORMAT_HEVC_H */
|
||||
+1
-2
@@ -33,7 +33,6 @@ const AVCodecTag ff_mp4_obj_type[] = {
|
||||
{ AV_CODEC_ID_MOV_TEXT , 0x08 },
|
||||
{ AV_CODEC_ID_MPEG4 , 0x20 },
|
||||
{ AV_CODEC_ID_H264 , 0x21 },
|
||||
{ AV_CODEC_ID_HEVC , 0x23 },
|
||||
{ AV_CODEC_ID_AAC , 0x40 },
|
||||
{ AV_CODEC_ID_MP4ALS , 0x40 }, /* 14496-3 ALS */
|
||||
{ AV_CODEC_ID_MPEG2VIDEO , 0x61 }, /* MPEG2 Main */
|
||||
@@ -152,8 +151,8 @@ const AVCodecTag ff_codec_movvideo_tags[] = {
|
||||
|
||||
{ AV_CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
|
||||
|
||||
{ AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, /* HEVC/H.265 which indicates parameter sets may be in ES */
|
||||
{ AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') }, /* HEVC/H.265 which indicates parameter sets shall not be in ES */
|
||||
{ AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, /* HEVC/H.265 which indicates parameter sets may be in ES */
|
||||
|
||||
{ AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */
|
||||
{ AV_CODEC_ID_H264, MKTAG('a', 'i', '5', 'p') }, /* AVC-Intra 50M 720p24/30/60 */
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
* @todo better probing than extensions matching
|
||||
*/
|
||||
|
||||
#define MODPLUG_STATIC
|
||||
#include <libmodplug/modplug.h>
|
||||
#include "libavutil/avstring.h"
|
||||
#include "libavutil/eval.h"
|
||||
|
||||
@@ -942,9 +942,7 @@ static int mkv_write_tag(AVFormatContext *s, AVDictionary *m, unsigned int eleme
|
||||
end_ebml_master(s->pb, targets);
|
||||
|
||||
while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
|
||||
if (av_strcasecmp(t->key, "title") &&
|
||||
av_strcasecmp(t->key, "stereo_mode") &&
|
||||
av_strcasecmp(t->key, "encoding_tool"))
|
||||
if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode"))
|
||||
mkv_write_simpletag(s->pb, t);
|
||||
|
||||
end_ebml_master(s->pb, tag);
|
||||
@@ -1149,10 +1147,7 @@ static int mkv_write_header(AVFormatContext *s)
|
||||
segment_uid[i] = av_lfg_get(&lfg);
|
||||
|
||||
put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , LIBAVFORMAT_IDENT);
|
||||
if ((tag = av_dict_get(s->metadata, "encoding_tool", NULL, 0)))
|
||||
put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, tag->value);
|
||||
else
|
||||
put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
|
||||
put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
|
||||
put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
|
||||
} else {
|
||||
const char *ident = "Lavf";
|
||||
|
||||
@@ -1330,7 +1330,6 @@ static void mov_parse_stsd_video(MOVContext *c, AVIOContext *pb,
|
||||
if (color_greyscale) {
|
||||
int color_index, color_dec;
|
||||
/* compute the greyscale palette */
|
||||
st->codec->bits_per_coded_sample = color_depth;
|
||||
color_count = 1 << color_depth;
|
||||
color_index = 255;
|
||||
color_dec = 256 / (color_count - 1);
|
||||
|
||||
+2
-29
@@ -39,7 +39,6 @@
|
||||
#include "libavutil/mathematics.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/dict.h"
|
||||
#include "hevc.h"
|
||||
#include "rtpenc.h"
|
||||
#include "mov_chan.h"
|
||||
|
||||
@@ -773,16 +772,6 @@ static int mov_write_avcc_tag(AVIOContext *pb, MOVTrack *track)
|
||||
return update_size(pb, pos);
|
||||
}
|
||||
|
||||
static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track)
|
||||
{
|
||||
int64_t pos = avio_tell(pb);
|
||||
|
||||
avio_wb32(pb, 0);
|
||||
ffio_wfourcc(pb, "hvcC");
|
||||
ff_isom_write_hvcc(pb, track->vos_data, track->vos_len, 0);
|
||||
return update_size(pb, pos);
|
||||
}
|
||||
|
||||
/* also used by all avid codecs (dv, imx, meridien) and their variants */
|
||||
static int mov_write_avid_tag(AVIOContext *pb, MOVTrack *track)
|
||||
{
|
||||
@@ -839,7 +828,6 @@ static int mp4_get_codec_tag(AVFormatContext *s, MOVTrack *track)
|
||||
return 0;
|
||||
|
||||
if (track->enc->codec_id == AV_CODEC_ID_H264) tag = MKTAG('a','v','c','1');
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_HEVC) tag = MKTAG('h','e','v','1');
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_AC3) tag = MKTAG('a','c','-','3');
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_DIRAC) tag = MKTAG('d','r','a','c');
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_MOV_TEXT) tag = MKTAG('t','x','3','g');
|
||||
@@ -918,14 +906,11 @@ static AVRational find_fps(AVFormatContext *s, AVStream *st)
|
||||
|
||||
static int mov_get_mpeg2_xdcam_codec_tag(AVFormatContext *s, MOVTrack *track)
|
||||
{
|
||||
int tag = track->enc->codec_tag;
|
||||
int tag = MKTAG('m', '2', 'v', '1'); //fallback tag
|
||||
int interlaced = track->enc->field_order > AV_FIELD_PROGRESSIVE;
|
||||
AVStream *st = track->st;
|
||||
int rate = av_q2d(find_fps(s, st));
|
||||
|
||||
if (!tag)
|
||||
tag = MKTAG('m', '2', 'v', '1'); //fallback tag
|
||||
|
||||
if (track->enc->pix_fmt == AV_PIX_FMT_YUV420P) {
|
||||
if (track->enc->width == 1280 && track->enc->height == 720) {
|
||||
if (!interlaced) {
|
||||
@@ -1241,8 +1226,6 @@ static int mov_write_video_tag(AVIOContext *pb, MOVTrack *track)
|
||||
avio_wb32(pb, 0);
|
||||
} else if (track->enc->codec_id == AV_CODEC_ID_DNXHD)
|
||||
mov_write_avid_tag(pb, track);
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_HEVC)
|
||||
mov_write_hvcc_tag(pb, track);
|
||||
else if (track->enc->codec_id == AV_CODEC_ID_H264) {
|
||||
mov_write_avcc_tag(pb, track);
|
||||
if (track->mode == MODE_IPOD)
|
||||
@@ -2225,8 +2208,7 @@ static int mov_write_ilst_tag(AVIOContext *pb, MOVMuxContext *mov,
|
||||
mov_write_string_metadata(s, pb, "\251wrt", "composer" , 1);
|
||||
mov_write_string_metadata(s, pb, "\251alb", "album" , 1);
|
||||
mov_write_string_metadata(s, pb, "\251day", "date" , 1);
|
||||
if (!mov_write_string_metadata(s, pb, "\251too", "encoding_tool", 1))
|
||||
mov_write_string_tag(pb, "\251too", LIBAVFORMAT_IDENT, 0, 1);
|
||||
mov_write_string_tag(pb, "\251too", LIBAVFORMAT_IDENT, 0, 1);
|
||||
mov_write_string_metadata(s, pb, "\251cmt", "comment" , 1);
|
||||
mov_write_string_metadata(s, pb, "\251gen", "genre" , 1);
|
||||
mov_write_string_metadata(s, pb, "\251cpy", "copyright", 1);
|
||||
@@ -3355,15 +3337,6 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
} else {
|
||||
size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size);
|
||||
}
|
||||
} else if (enc->codec_id == AV_CODEC_ID_HEVC && trk->vos_len > 6 &&
|
||||
(AV_RB24(trk->vos_data) == 1 || AV_RB32(trk->vos_data) == 1)) {
|
||||
/* extradata is Annex B, assume the bitstream is too and convert it */
|
||||
if (trk->hint_track >= 0 && trk->hint_track < mov->nb_streams) {
|
||||
ff_hevc_annexb2mp4_buf(pkt->data, &reformatted_data, &size, 0, NULL);
|
||||
avio_write(pb, reformatted_data, size);
|
||||
} else {
|
||||
size = ff_hevc_annexb2mp4(pb, pkt->data, pkt->size, 0, NULL);
|
||||
}
|
||||
} else {
|
||||
avio_write(pb, pkt->data, size);
|
||||
}
|
||||
|
||||
@@ -384,7 +384,7 @@ static int vorbis_packet(AVFormatContext *s, int idx)
|
||||
* here we parse the duration of each packet in the first page and compare
|
||||
* the total duration to the page granule to find the encoder delay and
|
||||
* set the first timestamp */
|
||||
if ((!os->lastpts || os->lastpts == AV_NOPTS_VALUE) && !(os->flags & OGG_FLAG_EOS) && (int64_t)os->granule>=0) {
|
||||
if ((!os->lastpts || os->lastpts == AV_NOPTS_VALUE) && !(os->flags & OGG_FLAG_EOS)) {
|
||||
int seg, d;
|
||||
uint8_t *last_pkt = os->buf + os->pstart;
|
||||
uint8_t *next_pkt = last_pkt;
|
||||
|
||||
@@ -216,13 +216,6 @@ T ldr \rt, [\rn]
|
||||
T add \rn, \rn, \rm
|
||||
.endm
|
||||
|
||||
.macro ldrc_pre cc, rt, rn, rm:vararg
|
||||
A ldr\cc \rt, [\rn, \rm]!
|
||||
T itt \cc
|
||||
T add\cc \rn, \rn, \rm
|
||||
T ldr\cc \rt, [\rn]
|
||||
.endm
|
||||
|
||||
.macro ldrd_reg rt, rt2, rn, rm
|
||||
A ldrd \rt, \rt2, [\rn, \rm]
|
||||
T add \rt, \rn, \rm
|
||||
|
||||
@@ -117,6 +117,35 @@ void av_buffer_unref(AVBufferRef **buf)
|
||||
}
|
||||
}
|
||||
|
||||
int av_buffer_release(AVBufferRef **buf, uint8_t **data)
|
||||
{
|
||||
AVBuffer *b;
|
||||
int ret = 0;
|
||||
|
||||
if (data)
|
||||
*data = NULL;
|
||||
if (!buf || !*buf)
|
||||
return 0;
|
||||
b = (*buf)->buffer;
|
||||
av_freep(buf);
|
||||
|
||||
if (data && avpriv_atomic_int_get(&b->refcount) > 1) {
|
||||
*data = av_memdup(b->data, b->size);
|
||||
if (!*data)
|
||||
ret = AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
if (!avpriv_atomic_int_add_and_fetch(&b->refcount, -1)) {
|
||||
if (data && !*data) {
|
||||
ret = 0;
|
||||
*data = b->data;
|
||||
} else
|
||||
b->free(b->opaque, b->data);
|
||||
av_freep(&b);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int av_buffer_is_writable(const AVBufferRef *buf)
|
||||
{
|
||||
if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY)
|
||||
|
||||
@@ -154,6 +154,18 @@ AVBufferRef *av_buffer_ref(AVBufferRef *buf);
|
||||
*/
|
||||
void av_buffer_unref(AVBufferRef **buf);
|
||||
|
||||
/**
|
||||
* Free a given reference and pass underlaying data to user provided pointer.
|
||||
* If there is more than one reference then data is copied.
|
||||
*
|
||||
* @param buf the reference to be released. The pointer is set to NULL on return.
|
||||
* @param data pointer to be passed with underlaying data.
|
||||
* @return 0 on success, a negative AVERROR on failure.
|
||||
*
|
||||
* @note on error buffer is properly released and *data is set to NULL.
|
||||
*/
|
||||
int av_buffer_release(AVBufferRef **buf, uint8_t **data);
|
||||
|
||||
/**
|
||||
* @return 1 if the caller may write to the data referred to by buf (which is
|
||||
* true if and only if buf is the only reference to the underlying AVBuffer).
|
||||
|
||||
@@ -113,7 +113,7 @@ typedef struct AVFloatDSPContext {
|
||||
* constraints: 32-byte aligned
|
||||
* @param src1 second input vector
|
||||
* constraints: 32-byte aligned
|
||||
* @param src2 third input vector
|
||||
* @param src1 third input vector
|
||||
* constraints: 32-byte aligned
|
||||
* @param len number of elements in the input
|
||||
* constraints: multiple of 16
|
||||
@@ -132,6 +132,8 @@ typedef struct AVFloatDSPContext {
|
||||
* constraints: 32-byte aligned
|
||||
* @param src1 second input vector
|
||||
* constraints: 32-byte aligned
|
||||
* @param src1 third input vector
|
||||
* constraints: 32-byte aligned
|
||||
* @param len number of elements in the input
|
||||
* constraints: multiple of 16
|
||||
*/
|
||||
|
||||
+1
-1
@@ -596,7 +596,7 @@ AVFrame *av_frame_alloc(void);
|
||||
void av_frame_free(AVFrame **frame);
|
||||
|
||||
/**
|
||||
* Set up a new reference to the data described by the source frame.
|
||||
* Setup a new reference to the data described by a given frame.
|
||||
*
|
||||
* Copy frame properties from src to dst and create a new reference for each
|
||||
* AVBufferRef from src.
|
||||
|
||||
@@ -26,10 +26,6 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64)
|
||||
#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS
|
||||
#endif
|
||||
|
||||
#define AV_TS_MAX_STRING_SIZE 32
|
||||
|
||||
/**
|
||||
|
||||
+20
-24
@@ -37,14 +37,14 @@
|
||||
#define ftello(x) _ftelli64(x)
|
||||
#endif
|
||||
|
||||
#define MIN(a,b) ((a) > (b) ? (b) : (a))
|
||||
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
|
||||
|
||||
#define BE_16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])
|
||||
|
||||
#define BE_32(x) (((uint32_t)(((uint8_t*)(x))[0]) << 24) | \
|
||||
(((uint8_t*)(x))[1] << 16) | \
|
||||
(((uint8_t*)(x))[2] << 8) | \
|
||||
((uint8_t*)(x))[3])
|
||||
#define BE_32(x) ((((uint8_t*)(x))[0] << 24) | \
|
||||
(((uint8_t*)(x))[1] << 16) | \
|
||||
(((uint8_t*)(x))[2] << 8) | \
|
||||
((uint8_t*)(x))[3])
|
||||
|
||||
#define BE_64(x) (((uint64_t)(((uint8_t*)(x))[0]) << 56) | \
|
||||
((uint64_t)(((uint8_t*)(x))[1]) << 48) | \
|
||||
@@ -89,7 +89,7 @@ int main(int argc, char *argv[])
|
||||
uint32_t atom_type = 0;
|
||||
uint64_t atom_size = 0;
|
||||
uint64_t atom_offset = 0;
|
||||
int64_t last_offset;
|
||||
uint64_t last_offset;
|
||||
unsigned char *moov_atom = NULL;
|
||||
unsigned char *ftyp_atom = NULL;
|
||||
uint64_t moov_atom_size;
|
||||
@@ -124,7 +124,7 @@ int main(int argc, char *argv[])
|
||||
if (fread(atom_bytes, ATOM_PREAMBLE_SIZE, 1, infile) != 1) {
|
||||
break;
|
||||
}
|
||||
atom_size = BE_32(&atom_bytes[0]);
|
||||
atom_size = (uint32_t) BE_32(&atom_bytes[0]);
|
||||
atom_type = BE_32(&atom_bytes[4]);
|
||||
|
||||
/* keep ftyp atom */
|
||||
@@ -137,9 +137,9 @@ int main(int argc, char *argv[])
|
||||
atom_size);
|
||||
goto error_out;
|
||||
}
|
||||
if (fseeko(infile, -ATOM_PREAMBLE_SIZE, SEEK_CUR) ||
|
||||
fread(ftyp_atom, atom_size, 1, infile) != 1 ||
|
||||
(start_offset = ftello(infile)) < 0) {
|
||||
if ( fseeko(infile, -ATOM_PREAMBLE_SIZE, SEEK_CUR)
|
||||
|| fread(ftyp_atom, atom_size, 1, infile) != 1
|
||||
|| (start_offset = ftello(infile))<0) {
|
||||
perror(argv[1]);
|
||||
goto error_out;
|
||||
}
|
||||
@@ -155,7 +155,7 @@ int main(int argc, char *argv[])
|
||||
} else {
|
||||
ret = fseeko(infile, atom_size - ATOM_PREAMBLE_SIZE, SEEK_CUR);
|
||||
}
|
||||
if (ret) {
|
||||
if(ret) {
|
||||
perror(argv[1]);
|
||||
goto error_out;
|
||||
}
|
||||
@@ -203,10 +203,6 @@ int main(int argc, char *argv[])
|
||||
goto error_out;
|
||||
}
|
||||
last_offset = ftello(infile);
|
||||
if (last_offset < 0) {
|
||||
perror(argv[1]);
|
||||
goto error_out;
|
||||
}
|
||||
moov_atom_size = atom_size;
|
||||
moov_atom = malloc(moov_atom_size);
|
||||
if (!moov_atom) {
|
||||
@@ -234,18 +230,18 @@ int main(int argc, char *argv[])
|
||||
atom_type = BE_32(&moov_atom[i]);
|
||||
if (atom_type == STCO_ATOM) {
|
||||
printf(" patching stco atom...\n");
|
||||
atom_size = BE_32(&moov_atom[i - 4]);
|
||||
atom_size = (uint32_t)BE_32(&moov_atom[i - 4]);
|
||||
if (i + atom_size - 4 > moov_atom_size) {
|
||||
printf(" bad atom size\n");
|
||||
goto error_out;
|
||||
}
|
||||
offset_count = BE_32(&moov_atom[i + 8]);
|
||||
if (i + 12 + offset_count * UINT64_C(4) > moov_atom_size) {
|
||||
printf(" bad atom size/element count\n");
|
||||
if (i + 12LL + offset_count * 4LL > moov_atom_size) {
|
||||
printf(" bad atom size\n");
|
||||
goto error_out;
|
||||
}
|
||||
for (j = 0; j < offset_count; j++) {
|
||||
current_offset = BE_32(&moov_atom[i + 12 + j * 4]);
|
||||
current_offset = (uint32_t)BE_32(&moov_atom[i + 12 + j * 4]);
|
||||
current_offset += moov_atom_size;
|
||||
moov_atom[i + 12 + j * 4 + 0] = (current_offset >> 24) & 0xFF;
|
||||
moov_atom[i + 12 + j * 4 + 1] = (current_offset >> 16) & 0xFF;
|
||||
@@ -255,14 +251,14 @@ int main(int argc, char *argv[])
|
||||
i += atom_size - 4;
|
||||
} else if (atom_type == CO64_ATOM) {
|
||||
printf(" patching co64 atom...\n");
|
||||
atom_size = BE_32(&moov_atom[i - 4]);
|
||||
atom_size = (uint32_t)BE_32(&moov_atom[i - 4]);
|
||||
if (i + atom_size - 4 > moov_atom_size) {
|
||||
printf(" bad atom size\n");
|
||||
goto error_out;
|
||||
}
|
||||
offset_count = BE_32(&moov_atom[i + 8]);
|
||||
if (i + 12 + offset_count * UINT64_C(8) > moov_atom_size) {
|
||||
printf(" bad atom size/element count\n");
|
||||
if (i + 12LL + offset_count * 8LL > moov_atom_size) {
|
||||
printf(" bad atom size\n");
|
||||
goto error_out;
|
||||
}
|
||||
for (j = 0; j < offset_count; j++) {
|
||||
@@ -320,7 +316,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
/* copy the remainder of the infile, from offset 0 -> last_offset - 1 */
|
||||
bytes_to_copy = MIN(COPY_BUFFER_SIZE, last_offset);
|
||||
bytes_to_copy = FFMIN(COPY_BUFFER_SIZE, last_offset);
|
||||
copy_buffer = malloc(bytes_to_copy);
|
||||
if (!copy_buffer) {
|
||||
printf("could not allocate %d bytes for copy_buffer\n", bytes_to_copy);
|
||||
@@ -328,7 +324,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
printf(" copying rest of file...\n");
|
||||
while (last_offset) {
|
||||
bytes_to_copy = MIN(bytes_to_copy, last_offset);
|
||||
bytes_to_copy = FFMIN(bytes_to_copy, last_offset);
|
||||
|
||||
if (fread(copy_buffer, bytes_to_copy, 1, infile) != 1) {
|
||||
perror(argv[1]);
|
||||
|
||||
Reference in New Issue
Block a user