Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
50032a75d6 | |||
eed53a38c9 | |||
501e60dcf5 | |||
d36c706b86 | |||
fcb8bbf264 | |||
38c5e8fec5 | |||
1301942248 | |||
e2c7b37fd2 | |||
7f90fe1b4b | |||
2cf6afffe5 | |||
50e6e494c9 | |||
0f54c97f58 | |||
a1f678f7ca | |||
94905d2af6 | |||
b04fbd2cd2 | |||
f7b045db09 | |||
de1591b167 | |||
c7b73724c7 | |||
2fb4be9a99 | |||
e1608014c5 |
@ -3,6 +3,11 @@ releases are sorted from youngest to oldest.
|
||||
|
||||
version next:
|
||||
|
||||
version 0.10.5:
|
||||
|
||||
- Several bugs and crashes have been fixed as well as build problems
|
||||
with recent mingw64
|
||||
|
||||
|
||||
version 0.10.4:
|
||||
|
||||
|
2
Doxyfile
2
Doxyfile
@ -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 = 0.10.4
|
||||
PROJECT_NUMBER = 0.10.5
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify an logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
2
configure
vendored
2
configure
vendored
@ -1168,6 +1168,7 @@ HAVE_LIST="
|
||||
dlfcn_h
|
||||
dlopen
|
||||
dos_paths
|
||||
dxva_h
|
||||
ebp_available
|
||||
ebx_available
|
||||
exp2
|
||||
@ -3047,6 +3048,7 @@ check_func_headers windows.h MapViewOfFile
|
||||
check_func_headers windows.h VirtualAlloc
|
||||
|
||||
check_header dlfcn.h
|
||||
check_header dxva.h
|
||||
check_header dxva2api.h -D_WIN32_WINNT=0x0600
|
||||
check_header libcrystalhd/libcrystalhd_if.h
|
||||
check_header malloc.h
|
||||
|
@ -407,6 +407,10 @@ prefix is ``ffmpeg2pass''. The complete file name will be
|
||||
@file{PREFIX-N.log}, where N is a number specific to the output
|
||||
stream
|
||||
|
||||
Note that this option is overwritten by a local option of the same name
|
||||
when using @code{-vcodec libx264}. That option maps to the x264 option stats
|
||||
which has a different syntax.
|
||||
|
||||
@item -vlang @var{code}
|
||||
Set the ISO 639 language code (3 letters) of the current video stream.
|
||||
|
||||
|
@ -268,6 +268,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
c->avctx = avctx;
|
||||
avctx->pix_fmt = PIX_FMT_PAL8;
|
||||
|
||||
if (avctx->width != SCREEN_WIDE || avctx->height != SCREEN_HIGH) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid dimension %dx%d\n", avctx->width, avctx->height);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
c->pic.reference = 1;
|
||||
if (avctx->get_buffer(avctx, &c->pic) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
|
@ -25,7 +25,14 @@
|
||||
|
||||
#define _WIN32_WINNT 0x0600
|
||||
#define COBJMACROS
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "dxva2.h"
|
||||
#if HAVE_DXVA_H
|
||||
#include <dxva.h>
|
||||
#endif
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "mpegvideo.h"
|
||||
|
||||
|
@ -48,7 +48,7 @@ typedef struct Escape124Context {
|
||||
CodeBook codebooks[3];
|
||||
} Escape124Context;
|
||||
|
||||
static int can_safely_read(GetBitContext* gb, int bits) {
|
||||
static int can_safely_read(GetBitContext* gb, uint64_t bits) {
|
||||
return get_bits_left(gb) >= bits;
|
||||
}
|
||||
|
||||
@ -90,7 +90,7 @@ static CodeBook unpack_codebook(GetBitContext* gb, unsigned depth,
|
||||
unsigned i, j;
|
||||
CodeBook cb = { 0 };
|
||||
|
||||
if (!can_safely_read(gb, size * 34))
|
||||
if (!can_safely_read(gb, size * 34L))
|
||||
return cb;
|
||||
|
||||
if (size >= INT_MAX / sizeof(MacroBlock))
|
||||
|
@ -228,7 +228,7 @@ static int decode_group3_2d_line(AVCodecContext *avctx, GetBitContext *gb,
|
||||
mode = !mode;
|
||||
}
|
||||
//sync line pointers
|
||||
while(run_off <= offs){
|
||||
while(offs < width && run_off <= offs){
|
||||
run_off += *ref++;
|
||||
run_off += *ref++;
|
||||
}
|
||||
|
@ -53,6 +53,7 @@ static int mpegaudio_parse(AVCodecParserContext *s1,
|
||||
int inc= FFMIN(buf_size - i, s->frame_size);
|
||||
i += inc;
|
||||
s->frame_size -= inc;
|
||||
state = 0;
|
||||
|
||||
if(!s->frame_size){
|
||||
next= i;
|
||||
|
@ -79,6 +79,7 @@ typedef struct ThreadContext {
|
||||
pthread_cond_t current_job_cond;
|
||||
pthread_mutex_t current_job_lock;
|
||||
int current_job;
|
||||
unsigned int current_execute;
|
||||
int done;
|
||||
} ThreadContext;
|
||||
|
||||
@ -203,6 +204,7 @@ static void* attribute_align_arg worker(void *v)
|
||||
AVCodecContext *avctx = v;
|
||||
ThreadContext *c = avctx->thread_opaque;
|
||||
int our_job = c->job_count;
|
||||
int last_execute = 0;
|
||||
int thread_count = avctx->thread_count;
|
||||
int self_id;
|
||||
|
||||
@ -213,7 +215,9 @@ static void* attribute_align_arg worker(void *v)
|
||||
if (c->current_job == thread_count + c->job_count)
|
||||
pthread_cond_signal(&c->last_job_cond);
|
||||
|
||||
pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);
|
||||
while (last_execute == c->current_execute && !c->done)
|
||||
pthread_cond_wait(&c->current_job_cond, &c->current_job_lock);
|
||||
last_execute = c->current_execute;
|
||||
our_job = self_id;
|
||||
|
||||
if (c->done) {
|
||||
@ -233,7 +237,8 @@ static void* attribute_align_arg worker(void *v)
|
||||
|
||||
static av_always_inline void avcodec_thread_park_workers(ThreadContext *c, int thread_count)
|
||||
{
|
||||
pthread_cond_wait(&c->last_job_cond, &c->current_job_lock);
|
||||
while (c->current_job != thread_count + c->job_count)
|
||||
pthread_cond_wait(&c->last_job_cond, &c->current_job_lock);
|
||||
pthread_mutex_unlock(&c->current_job_lock);
|
||||
}
|
||||
|
||||
@ -282,6 +287,7 @@ static int avcodec_thread_execute(AVCodecContext *avctx, action_func* func, void
|
||||
c->rets = &dummy_ret;
|
||||
c->rets_count = 1;
|
||||
}
|
||||
c->current_execute++;
|
||||
pthread_cond_broadcast(&c->current_job_cond);
|
||||
|
||||
avcodec_thread_park_workers(c, avctx->thread_count);
|
||||
|
@ -72,7 +72,7 @@ static int sp5x_decode_frame(AVCodecContext *avctx,
|
||||
for (i = 2; i < buf_size-2 && j < buf_size+1024-2; i++)
|
||||
recoded[j++] = buf[i];
|
||||
else
|
||||
for (i = 14; i < buf_size && j < buf_size+1024-2; i++)
|
||||
for (i = 14; i < buf_size && j < buf_size+1024-3; i++)
|
||||
{
|
||||
recoded[j++] = buf[i];
|
||||
if (buf[i] == 0xff)
|
||||
|
@ -30,7 +30,7 @@
|
||||
|
||||
|
||||
#define ASF_INDEXED_INTERVAL 10000000
|
||||
#define ASF_INDEX_BLOCK 600
|
||||
#define ASF_INDEX_BLOCK (1<<9)
|
||||
|
||||
#define ASF_PACKET_ERROR_CORRECTION_DATA_SIZE 0x2
|
||||
#define ASF_PACKET_ERROR_CORRECTION_FLAGS (\
|
||||
@ -208,11 +208,13 @@ typedef struct {
|
||||
/* only for reading */
|
||||
uint64_t data_offset; ///< beginning of the first data packet
|
||||
|
||||
int64_t last_indexed_pts;
|
||||
ASFIndex* index_ptr;
|
||||
uint32_t nb_index_count;
|
||||
uint32_t nb_index_memory_alloc;
|
||||
uint16_t maximum_packet;
|
||||
uint32_t next_packet_number;
|
||||
uint16_t next_packet_count;
|
||||
int next_start_sec;
|
||||
int end_sec;
|
||||
} ASFContext;
|
||||
|
||||
static const AVCodecTag codec_asf_bmp_tags[] = {
|
||||
@ -557,10 +559,8 @@ static int asf_write_header(AVFormatContext *s)
|
||||
s->packet_size = PACKET_SIZE;
|
||||
asf->nb_packets = 0;
|
||||
|
||||
asf->last_indexed_pts = 0;
|
||||
asf->index_ptr = av_malloc( sizeof(ASFIndex) * ASF_INDEX_BLOCK );
|
||||
asf->nb_index_memory_alloc = ASF_INDEX_BLOCK;
|
||||
asf->nb_index_count = 0;
|
||||
asf->maximum_packet = 0;
|
||||
|
||||
/* the data-chunk-size has to be 50, which is data_size - asf->data_offset
|
||||
@ -782,14 +782,42 @@ static void put_frame(
|
||||
stream->seq++;
|
||||
}
|
||||
|
||||
static void update_index(AVFormatContext *s, int start_sec,
|
||||
uint32_t packet_number, uint16_t packet_count)
|
||||
{
|
||||
ASFContext *asf = s->priv_data;
|
||||
|
||||
if (start_sec > asf->next_start_sec) {
|
||||
int i;
|
||||
|
||||
if (!asf->next_start_sec) {
|
||||
asf->next_packet_number = packet_number;
|
||||
asf->next_packet_count = packet_count;
|
||||
}
|
||||
|
||||
if (start_sec > asf->nb_index_memory_alloc) {
|
||||
asf->nb_index_memory_alloc = (start_sec + ASF_INDEX_BLOCK) & ~(ASF_INDEX_BLOCK - 1);
|
||||
asf->index_ptr = av_realloc( asf->index_ptr, sizeof(ASFIndex) * asf->nb_index_memory_alloc );
|
||||
}
|
||||
for (i = asf->next_start_sec; i < start_sec; i++) {
|
||||
asf->index_ptr[i].packet_number = asf->next_packet_number;
|
||||
asf->index_ptr[i].packet_count = asf->next_packet_count;
|
||||
}
|
||||
}
|
||||
asf->maximum_packet = FFMAX(asf->maximum_packet, packet_count);
|
||||
asf->next_packet_number = packet_number;
|
||||
asf->next_packet_count = packet_count;
|
||||
asf->next_start_sec = start_sec;
|
||||
}
|
||||
|
||||
static int asf_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
{
|
||||
ASFContext *asf = s->priv_data;
|
||||
ASFStream *stream;
|
||||
int64_t duration;
|
||||
AVCodecContext *codec;
|
||||
int64_t packet_st,pts;
|
||||
int start_sec,i;
|
||||
uint32_t packet_number;
|
||||
int64_t pts;
|
||||
int start_sec;
|
||||
int flags= pkt->flags;
|
||||
|
||||
codec = s->streams[pkt->stream_index]->codec;
|
||||
@ -800,30 +828,22 @@ static int asf_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
|
||||
pts = (pkt->pts != AV_NOPTS_VALUE) ? pkt->pts : pkt->dts;
|
||||
assert(pts != AV_NOPTS_VALUE);
|
||||
duration = pts * 10000;
|
||||
asf->duration= FFMAX(asf->duration, duration + pkt->duration * 10000);
|
||||
pts *= 10000;
|
||||
asf->duration= FFMAX(asf->duration, pts + pkt->duration * 10000);
|
||||
|
||||
packet_st = asf->nb_packets;
|
||||
packet_number = asf->nb_packets;
|
||||
put_frame(s, stream, s->streams[pkt->stream_index], pkt->dts, pkt->data, pkt->size, flags);
|
||||
|
||||
start_sec = (int)((PREROLL_TIME * 10000 + pts + ASF_INDEXED_INTERVAL - 1)
|
||||
/ ASF_INDEXED_INTERVAL);
|
||||
|
||||
/* check index */
|
||||
if ((!asf->is_streamed) && (flags & AV_PKT_FLAG_KEY)) {
|
||||
start_sec = (int)(duration / INT64_C(10000000));
|
||||
if (start_sec != (int)(asf->last_indexed_pts / INT64_C(10000000))) {
|
||||
for(i=asf->nb_index_count;i<start_sec;i++) {
|
||||
if (i>=asf->nb_index_memory_alloc) {
|
||||
asf->nb_index_memory_alloc += ASF_INDEX_BLOCK;
|
||||
asf->index_ptr = (ASFIndex*)av_realloc( asf->index_ptr, sizeof(ASFIndex) * asf->nb_index_memory_alloc );
|
||||
}
|
||||
// store
|
||||
asf->index_ptr[i].packet_number = (uint32_t)packet_st;
|
||||
asf->index_ptr[i].packet_count = (uint16_t)(asf->nb_packets-packet_st);
|
||||
asf->maximum_packet = FFMAX(asf->maximum_packet, (uint16_t)(asf->nb_packets-packet_st));
|
||||
}
|
||||
asf->nb_index_count = start_sec;
|
||||
asf->last_indexed_pts = duration;
|
||||
}
|
||||
uint16_t packet_count = asf->nb_packets - packet_number;
|
||||
update_index(s, start_sec, packet_number, packet_count);
|
||||
}
|
||||
asf->end_sec = start_sec;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -858,8 +878,9 @@ static int asf_write_trailer(AVFormatContext *s)
|
||||
|
||||
/* write index */
|
||||
data_size = avio_tell(s->pb);
|
||||
if ((!asf->is_streamed) && (asf->nb_index_count != 0)) {
|
||||
asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->nb_index_count);
|
||||
if (!asf->is_streamed && asf->next_start_sec) {
|
||||
update_index(s, asf->end_sec + 1, 0, 0);
|
||||
asf_write_index(s, asf->index_ptr, asf->maximum_packet, asf->next_start_sec);
|
||||
}
|
||||
avio_flush(s->pb);
|
||||
|
||||
|
@ -2071,9 +2071,6 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
#if CONFIG_H263_DECODER
|
||||
case CODEC_ID_H263:
|
||||
#endif
|
||||
#if CONFIG_H264_DECODER
|
||||
case CODEC_ID_H264:
|
||||
#endif
|
||||
#if CONFIG_MPEG4_DECODER
|
||||
case CODEC_ID_MPEG4:
|
||||
#endif
|
||||
|
@ -498,8 +498,10 @@ static int swf_write_trailer(AVFormatContext *s)
|
||||
avio_wl32(pb, file_size);
|
||||
avio_seek(pb, swf->duration_pos, SEEK_SET);
|
||||
avio_wl16(pb, swf->video_frame_number);
|
||||
if (swf->vframes_pos) {
|
||||
avio_seek(pb, swf->vframes_pos, SEEK_SET);
|
||||
avio_wl16(pb, swf->video_frame_number);
|
||||
}
|
||||
avio_seek(pb, file_size, SEEK_SET);
|
||||
}
|
||||
return 0;
|
||||
|
@ -84,8 +84,8 @@ uninstall-libs::
|
||||
-$(RM) "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR)" \
|
||||
"$(SHLIBDIR)/$(SLIBNAME)" \
|
||||
"$(SHLIBDIR)/$(SLIBNAME_WITH_VERSION)"
|
||||
-$(RM) $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)"%)
|
||||
-$(RM) $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)"%)
|
||||
-$(RM) $(SLIB_INSTALL_EXTRA_SHLIB:%="$(SHLIBDIR)/%")
|
||||
-$(RM) $(SLIB_INSTALL_EXTRA_LIB:%="$(LIBDIR)/%")
|
||||
-$(RM) "$(LIBDIR)/$(LIBNAME)"
|
||||
|
||||
uninstall-headers::
|
||||
|
@ -1,3 +1,3 @@
|
||||
3d410176ebf9ffdf99d2738922cef260 *./tests/data/lavf/lavf.asf
|
||||
333489 ./tests/data/lavf/lavf.asf
|
||||
cee474c51df8a3e67d01b733cafbb7e8 *./tests/data/lavf/lavf.asf
|
||||
333581 ./tests/data/lavf/lavf.asf
|
||||
./tests/data/lavf/lavf.asf CRC=0x9f5ab3e6
|
||||
|
@ -2,9 +2,9 @@ ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st:-1 flags:0 ts:-1.000000
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st:-1 flags:1 ts: 1.894167
|
||||
ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209
|
||||
ret: 0 st: 0 flags:0 ts: 0.788000
|
||||
ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209
|
||||
ret: 0 st: 0 flags:1 ts:-0.317000
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st: 1 flags:0 ts: 2.577000
|
||||
@ -22,11 +22,11 @@ ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st: 1 flags:0 ts:-0.058000
|
||||
ret: 0 st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos: 29489 size: 208
|
||||
ret: 0 st: 1 flags:1 ts: 2.836000
|
||||
ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.862000 pts: 0.862000 pos: 279089 size: 209
|
||||
ret: 0 st:-1 flags:0 ts: 1.730004
|
||||
ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st:-1 flags:1 ts: 0.624171
|
||||
ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st: 0 flags:0 ts:-0.482000
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st: 0 flags:1 ts: 2.413000
|
||||
@ -34,19 +34,19 @@ ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st: 1 flags:0 ts: 1.307000
|
||||
ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209
|
||||
ret: 0 st: 1 flags:1 ts: 0.201000
|
||||
ret: 0 st: 1 flags:1 dts: 0.183000 pts: 0.183000 pos: 71089 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209
|
||||
ret: 0 st:-1 flags:0 ts:-0.904994
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st:-1 flags:1 ts: 1.989173
|
||||
ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st: 0 flags:0 ts: 0.883000
|
||||
ret: 0 st: 1 flags:1 dts: 0.940000 pts: 0.940000 pos: 301489 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209
|
||||
ret: 0 st: 0 flags:1 ts:-0.222000
|
||||
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 689 size: 28487
|
||||
ret: 0 st: 1 flags:0 ts: 2.672000
|
||||
ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209
|
||||
ret: 0 st: 1 flags:1 ts: 1.566000
|
||||
ret: 0 st: 1 flags:1 dts: 0.967000 pts: 0.967000 pos: 330289 size: 209
|
||||
ret: 0 st: 1 flags:1 dts: 0.862000 pts: 0.862000 pos: 279089 size: 209
|
||||
ret: 0 st:-1 flags:0 ts: 0.460008
|
||||
ret: 0 st: 1 flags:1 dts: 0.444000 pts: 0.444000 pos: 147889 size: 209
|
||||
ret: 0 st:-1 flags:1 ts:-0.645825
|
||||
|
Reference in New Issue
Block a user