[FFmpeg-cvslog] hevc: Fix a53 caption extraction
ffmpeg | branch: master | Will Kelleher | Wed Nov 11 15:37:29 2015 -0600| [b1a32429ef6ccd94673e4c36924ad0949f4d50a1] | committer: Michael Niedermayer hevc: Fix a53 caption extraction Just realized my previous patch doesn't work quite right. I uploaded a better sample file that actually has visible captions to /incoming/hevc_cc.ts. I tested with that file doing hevc->x264 and it works. This is basically an exact copy of the existing h264 logic. Signed-off-by: Will Kelleher Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b1a32429ef6ccd94673e4c36924ad0949f4d50a1 --- libavcodec/hevc.c |1 + libavcodec/hevc_sei.c | 27 +-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index 1fa5283..ece36f8 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -2573,6 +2573,7 @@ static int set_side_data(HEVCContext *s) if (sd) memcpy(sd->data, s->a53_caption, s->a53_caption_size); av_freep(&s->a53_caption); +s->a53_caption_size = 0; s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS; } diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c index e853067..46cd06b 100644 --- a/libavcodec/hevc_sei.c +++ b/libavcodec/hevc_sei.c @@ -151,7 +151,6 @@ static int decode_registered_user_data_closed_caption(HEVCContext *s, int size) int flag; int user_data_type_code; int cc_count; -int i; GetBitContext *gb = &s->HEVClc->gb; @@ -170,20 +169,28 @@ static int decode_registered_user_data_closed_caption(HEVCContext *s, int size) size -= 2; if (cc_count && size >= cc_count * 3) { -av_freep(&s->a53_caption); -s->a53_caption_size = cc_count * 3; - -s->a53_caption = av_malloc(s->a53_caption_size); -if (!s->a53_caption) -return(AVERROR(ENOMEM)); - -for (i = 0; i < s->a53_caption_size; i++) { -s->a53_caption[i++] = get_bits(gb, 8); +const uint64_t new_size = (s->a53_caption_size + cc_count + * UINT64_C(3)); +int i, ret; + +if (new_size > INT_MAX) +return AVERROR(EINVAL); + +/* Allow merging of the cc data from two fields. */ +ret = av_reallocp(&s->a53_caption, new_size); +if (ret < 0) +return ret; + +for (i = 0; i < cc_count; i++) { +s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8); +s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8); +s->a53_caption[s->a53_caption_size++] = get_bits(gb, 8); } skip_bits(gb, 8); // marker_bits } } } else { +int i; for (i = 0; i < size - 1; i++) skip_bits(gb, 8); } ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] os2threads: Add pthread_once()
ffmpeg | branch: master | KO Myung-Hun | Thu Nov 12 12:31:51 2015 +0900| [6248f23859eb610079b1964e5f081ff0e9c62281] | committer: Michael Niedermayer os2threads: Add pthread_once() Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6248f23859eb610079b1964e5f081ff0e9c62281 --- compat/os2threads.h | 27 +++ 1 file changed, 27 insertions(+) diff --git a/compat/os2threads.h b/compat/os2threads.h index 5b6ca55..f8fb2c8 100644 --- a/compat/os2threads.h +++ b/compat/os2threads.h @@ -32,6 +32,8 @@ #undef __STRICT_ANSI__ /* for _beginthread() */ #include +#include + #include "libavutil/mem.h" typedef TID pthread_t; @@ -47,6 +49,13 @@ typedef struct { typedef void pthread_condattr_t; +typedef struct { +volatile int done; +_fmutex mtx; +} pthread_once_t; + +#define PTHREAD_ONCE_INIT {0, _FMUTEX_INITIALIZER} + struct thread_arg { void *(*start_routine)(void *); void *arg; @@ -163,4 +172,22 @@ static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mute return 0; } +static av_always_inline int pthread_once(pthread_once_t *once_control, void (*init_routine)(void)) +{ +if (!once_control->done) +{ +_fmutex_request(&once_control->mtx, 0); + +if (!once_control->done) +{ +init_routine(); + +once_control->done = 1; +} + +_fmutex_release(&once_control->mtx); +} + +return 0; +} #endif /* AVCODEC_OS2PTHREADS_H */ ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avformat/mux: Rename compute_pkt_fields2(), the name is absolutely terrible
ffmpeg | branch: master | Michael Niedermayer | Thu Nov 12 23:06:32 2015 +0100| [0106a20aeae868a4fa7a2eb6e11a6c67c83d4bfb] | committer: Michael Niedermayer avformat/mux: Rename compute_pkt_fields2(), the name is absolutely terrible Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0106a20aeae868a4fa7a2eb6e11a6c67c83d4bfb --- libavformat/mux.c |8 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavformat/mux.c b/libavformat/mux.c index 135039f..05d4170 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -491,7 +491,7 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options) #if FF_API_COMPUTE_PKT_FIELDS2 //FIXME merge with compute_pkt_fields -static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt) +static int compute_muxer_pkt_fields(AVFormatContext *s, AVStream *st, AVPacket *pkt) { int delay = FFMAX(st->codec->has_b_frames, st->codec->max_b_frames > 0); int num, den, i; @@ -508,7 +508,7 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt) } if (s->debug & FF_FDEBUG_TS) -av_log(s, AV_LOG_TRACE, "compute_pkt_fields2: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n", +av_log(s, AV_LOG_TRACE, "compute_muxer_pkt_fields: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n", av_ts2str(pkt->pts), av_ts2str(pkt->dts), av_ts2str(st->cur_dts), delay, pkt->size, pkt->stream_index); if (pkt->duration < 0 && st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) { @@ -783,7 +783,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt) } #if FF_API_COMPUTE_PKT_FIELDS2 -ret = compute_pkt_fields2(s, s->streams[pkt->stream_index], pkt); +ret = compute_muxer_pkt_fields(s, s->streams[pkt->stream_index], pkt); if (ret < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) return ret; @@ -1013,7 +1013,7 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt) pkt->size, av_ts2str(pkt->dts), av_ts2str(pkt->pts)); #if FF_API_COMPUTE_PKT_FIELDS2 -if ((ret = compute_pkt_fields2(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) +if ((ret = compute_muxer_pkt_fields(s, st, pkt)) < 0 && !(s->oformat->flags & AVFMT_NOTIMESTAMPS)) goto fail; #endif ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
[FFmpeg-cvslog] avformat/segafilm: Fix current_sample after seeking and avio_seek return type
ffmpeg | branch: master | Michael Niedermayer | Thu Nov 12 23:37:21 2015 +0100| [5324109dd7e1bfc0236bf74a492a66f26289d16e] | committer: Michael Niedermayer avformat/segafilm: Fix current_sample after seeking and avio_seek return type Signed-off-by: Michael Niedermayer > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5324109dd7e1bfc0236bf74a492a66f26289d16e --- libavformat/segafilm.c |7 --- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libavformat/segafilm.c b/libavformat/segafilm.c index 86917e7..94b3772 100644 --- a/libavformat/segafilm.c +++ b/libavformat/segafilm.c @@ -296,13 +296,14 @@ static int film_read_seek(AVFormatContext *s, int stream_index, int64_t timestam { FilmDemuxContext *film = s->priv_data; AVStream *st = s->streams[stream_index]; +int64_t pos; int ret = av_index_search_timestamp(st, timestamp, flags); if (ret < 0) return ret; -ret = avio_seek(s->pb, st->index_entries[ret].pos, SEEK_SET); -if (ret < 0) -return ret; +pos = avio_seek(s->pb, st->index_entries[ret].pos, SEEK_SET); +if (pos < 0) +return pos; film->current_sample = ret; ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog