Commit 8e2bab5d authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master:
  drawtext: remove typo
  pcm-mpeg: implement new audio decoding api
  w32thread: port fixes to pthread_cond_broadcast() from x264.
  doc: add editor configuration section with Vim and Emacs settings
  dxva2.h: include d3d9.h to define LPDIRECT3DSURFACE9
  avformat/utils: Drop unused goto label.
  doxygen: Replace '\' by '@' in Doxygen markup tags.
  cosmetics: drop some completely pointless parentheses
  cljr: simplify CLJRContext
  drawtext: introduce rand(min, max)
  drawtext: introduce explicit draw/hide variable
  rtmp: Use nb_invokes for all invoke commands

Conflicts:
	libavcodec/mpegvideo.c
	libavfilter/vf_drawtext.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 7023fb81 78212cef
...@@ -179,6 +179,31 @@ Casts should be used only when necessary. Unneeded parentheses ...@@ -179,6 +179,31 @@ Casts should be used only when necessary. Unneeded parentheses
should also be avoided if they don't make the code easier to understand. should also be avoided if they don't make the code easier to understand.
@end itemize @end itemize
@subsection Editor configuration
In order to configure Vim to follow Libav formatting conventions, paste
the following snippet into your @file{.vimrc}:
@example
" indentation rules for libav: 4 spaces, no tabs
set expandtab
set shiftwidth=4
set softtabstop=4
" allow tabs in Makefiles
autocmd FileType make set noexpandtab shiftwidth=8 softtabstop=8
" Trailing whitespace and tabs are forbidden, so highlight them.
highlight ForbiddenWhitespace ctermbg=red guibg=red
match ForbiddenWhitespace /\s\+$\|\t/
" Do not highlight spaces at the end of line while typing on that line.
autocmd InsertEnter * match ForbiddenWhitespace /\t\|\s\+\%#\@@<!$/
@end example
For Emacs, add these roughly equivalent lines to your @file{.emacs.d/init.el}:
@example
(setq c-default-style "k&r")
(setq-default c-basic-offset 4)
(setq-default indent-tabs-mode nil)
(setq-default show-trailing-whitespace t)
@end example
@section Development Policy @section Development Policy
@enumerate @enumerate
......
...@@ -708,9 +708,10 @@ static int decodeChannelSoundUnit (ATRAC3Context *q, GetBitContext *gb, channel_ ...@@ -708,9 +708,10 @@ static int decodeChannelSoundUnit (ATRAC3Context *q, GetBitContext *gb, channel_
memset(pSnd->IMDCT_buf, 0, 512 * sizeof(float)); memset(pSnd->IMDCT_buf, 0, 512 * sizeof(float));
/* gain compensation and overlapping */ /* gain compensation and overlapping */
gainCompensateAndOverlap (pSnd->IMDCT_buf, &(pSnd->prevFrame[band*256]), &(pOut[band*256]), gainCompensateAndOverlap(pSnd->IMDCT_buf, &pSnd->prevFrame[band * 256],
&((pSnd->gainBlock[1 - (pSnd->gcBlkSwitch)]).gBlock[band]), &pOut[band * 256],
&((pSnd->gainBlock[pSnd->gcBlkSwitch]).gBlock[band])); &pSnd->gainBlock[1 - pSnd->gcBlkSwitch].gBlock[band],
&pSnd->gainBlock[ pSnd->gcBlkSwitch].gBlock[band]);
} }
/* Swap the gain control buffers for the next frame. */ /* Swap the gain control buffers for the next frame. */
...@@ -795,7 +796,9 @@ static int decodeFrame(ATRAC3Context *q, const uint8_t* databuf, ...@@ -795,7 +796,9 @@ static int decodeFrame(ATRAC3Context *q, const uint8_t* databuf,
for (i=0 ; i<q->channels ; i++) { for (i=0 ; i<q->channels ; i++) {
/* Set the bitstream reader at the start of a channel sound unit. */ /* Set the bitstream reader at the start of a channel sound unit. */
init_get_bits(&q->gb, databuf+((i*q->bytes_per_frame)/q->channels), (q->bits_per_frame)/q->channels); init_get_bits(&q->gb,
databuf + i * q->bytes_per_frame / q->channels,
q->bits_per_frame / q->channels);
result = decodeChannelSoundUnit(q,&q->gb, &q->pUnits[i], out_samples[i], i, q->codingMode); result = decodeChannelSoundUnit(q,&q->gb, &q->pUnits[i], out_samples[i], i, q->codingMode);
if (result != 0) if (result != 0)
......
...@@ -35,9 +35,6 @@ ...@@ -35,9 +35,6 @@
typedef struct CLJRContext{ typedef struct CLJRContext{
AVCodecContext *avctx; AVCodecContext *avctx;
AVFrame picture; AVFrame picture;
int delta[16];
int offset[4];
GetBitContext gb;
} CLJRContext; } CLJRContext;
static int decode_frame(AVCodecContext *avctx, static int decode_frame(AVCodecContext *avctx,
...@@ -47,6 +44,7 @@ static int decode_frame(AVCodecContext *avctx, ...@@ -47,6 +44,7 @@ static int decode_frame(AVCodecContext *avctx,
const uint8_t *buf = avpkt->data; const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size; int buf_size = avpkt->size;
CLJRContext * const a = avctx->priv_data; CLJRContext * const a = avctx->priv_data;
GetBitContext gb;
AVFrame *picture = data; AVFrame *picture = data;
AVFrame * const p= (AVFrame*)&a->picture; AVFrame * const p= (AVFrame*)&a->picture;
int x, y; int x, y;
...@@ -67,20 +65,20 @@ static int decode_frame(AVCodecContext *avctx, ...@@ -67,20 +65,20 @@ static int decode_frame(AVCodecContext *avctx,
p->pict_type= AV_PICTURE_TYPE_I; p->pict_type= AV_PICTURE_TYPE_I;
p->key_frame= 1; p->key_frame= 1;
init_get_bits(&a->gb, buf, buf_size * 8); init_get_bits(&gb, buf, buf_size * 8);
for(y=0; y<avctx->height; y++){ for(y=0; y<avctx->height; y++){
uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ]; uint8_t *luma= &a->picture.data[0][ y*a->picture.linesize[0] ];
uint8_t *cb= &a->picture.data[1][ y*a->picture.linesize[1] ]; uint8_t *cb= &a->picture.data[1][ y*a->picture.linesize[1] ];
uint8_t *cr= &a->picture.data[2][ y*a->picture.linesize[2] ]; uint8_t *cr= &a->picture.data[2][ y*a->picture.linesize[2] ];
for(x=0; x<avctx->width; x+=4){ for(x=0; x<avctx->width; x+=4){
luma[3] = get_bits(&a->gb, 5) << 3; luma[3] = get_bits(&gb, 5) << 3;
luma[2] = get_bits(&a->gb, 5) << 3; luma[2] = get_bits(&gb, 5) << 3;
luma[1] = get_bits(&a->gb, 5) << 3; luma[1] = get_bits(&gb, 5) << 3;
luma[0] = get_bits(&a->gb, 5) << 3; luma[0] = get_bits(&gb, 5) << 3;
luma+= 4; luma+= 4;
*(cb++) = get_bits(&a->gb, 6) << 2; *(cb++) = get_bits(&gb, 6) << 2;
*(cr++) = get_bits(&a->gb, 6) << 2; *(cr++) = get_bits(&gb, 6) << 2;
} }
} }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <stdint.h> #include <stdint.h>
#include <d3d9.h>
#include <dxva2api.h> #include <dxva2api.h>
#define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards #define FF_DXVA2_WORKAROUND_SCALING_LIST_ZIGZAG 1 ///< Work around for DXVA2 and old UVD/UVD+ ATI video cards
......
...@@ -840,10 +840,14 @@ av_cold int MPV_common_init(MpegEncContext *s) ...@@ -840,10 +840,14 @@ av_cold int MPV_common_init(MpegEncContext *s)
FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail); FF_ALLOCZ_OR_GOTO(s->avctx, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE, fail);
s->parse_context.state = -1; s->parse_context.state = -1;
if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)) { if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
s->visualization_buffer[0] = av_malloc((s->mb_width * 16 + 2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH); s->avctx->debug_mv) {
s->visualization_buffer[1] = av_malloc((s->mb_width * 16 + 2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH); s->visualization_buffer[0] = av_malloc((s->mb_width * 16 +
s->visualization_buffer[2] = av_malloc((s->mb_width * 16 + 2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH); 2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH);
s->visualization_buffer[1] = av_malloc((s->mb_width * 16 +
2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH);
s->visualization_buffer[2] = av_malloc((s->mb_width * 16 +
2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH);
} }
s->context_initialized = 1; s->context_initialized = 1;
...@@ -1512,7 +1516,8 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ ...@@ -1512,7 +1516,8 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
} }
} }
if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){ if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
s->avctx->debug_mv) {
const int shift= 1 + s->quarter_sample; const int shift= 1 + s->quarter_sample;
int mb_y; int mb_y;
uint8_t *ptr; uint8_t *ptr;
...@@ -1538,7 +1543,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ ...@@ -1538,7 +1543,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
int mb_x; int mb_x;
for(mb_x=0; mb_x<s->mb_width; mb_x++){ for(mb_x=0; mb_x<s->mb_width; mb_x++){
const int mb_index= mb_x + mb_y*s->mb_stride; const int mb_index= mb_x + mb_y*s->mb_stride;
if((s->avctx->debug_mv) && pict->motion_val){ if (s->avctx->debug_mv && pict->motion_val) {
int type; int type;
for(type=0; type<3; type++){ for(type=0; type<3; type++){
int direction = 0; int direction = 0;
......
...@@ -585,7 +585,7 @@ static inline void chroma_4mv_motion(MpegEncContext *s, ...@@ -585,7 +585,7 @@ static inline void chroma_4mv_motion(MpegEncContext *s,
if (src_y == (s->height >> 1)) if (src_y == (s->height >> 1))
dxy &= ~2; dxy &= ~2;
offset = (src_y * (s->uvlinesize)) + src_x; offset = src_y * s->uvlinesize + src_x;
ptr = ref_picture[1] + offset; ptr = ref_picture[1] + offset;
if(s->flags&CODEC_FLAG_EMU_EDGE){ if(s->flags&CODEC_FLAG_EMU_EDGE){
if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8 if( (unsigned)src_x > (s->h_edge_pos>>1) - (dxy &1) - 8
......
...@@ -138,8 +138,8 @@ static int msrle_decode_8_16_24_32(AVCodecContext *avctx, AVPicture *pic, int de ...@@ -138,8 +138,8 @@ static int msrle_decode_8_16_24_32(AVCodecContext *avctx, AVPicture *pic, int de
uint32_t av_uninit(pix32); uint32_t av_uninit(pix32);
unsigned int width= FFABS(pic->linesize[0]) / (depth >> 3); unsigned int width= FFABS(pic->linesize[0]) / (depth >> 3);
output = pic->data[0] + (avctx->height - 1) * pic->linesize[0]; output = pic->data[0] + (avctx->height - 1) * pic->linesize[0];
output_end = pic->data[0] + (avctx->height) * pic->linesize[0]; output_end = pic->data[0] + avctx->height * pic->linesize[0];
while(src < data + srcsize) { while(src < data + srcsize) {
p1 = *src++; p1 = *src++;
if(p1 == 0) { //Escape code if(p1 == 0) { //Escape code
......
...@@ -121,17 +121,30 @@ static int pcm_bluray_parse_header(AVCodecContext *avctx, ...@@ -121,17 +121,30 @@ static int pcm_bluray_parse_header(AVCodecContext *avctx,
return 0; return 0;
} }
static int pcm_bluray_decode_frame(AVCodecContext *avctx, typedef struct PCMBRDecode {
void *data, AVFrame frame;
int *data_size, } PCMBRDecode;
AVPacket *avpkt)
static av_cold int pcm_bluray_decode_init(AVCodecContext * avctx)
{
PCMBRDecode *s = avctx->priv_data;
avcodec_get_frame_defaults(&s->frame);
avctx->coded_frame = &s->frame;
return 0;
}
static int pcm_bluray_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{ {
const uint8_t *src = avpkt->data; const uint8_t *src = avpkt->data;
int buf_size = avpkt->size; int buf_size = avpkt->size;
PCMBRDecode *s = avctx->priv_data;
int num_source_channels, channel, retval; int num_source_channels, channel, retval;
int sample_size, samples, output_size; int sample_size, samples;
int16_t *dst16 = data; int16_t *dst16;
int32_t *dst32 = data; int32_t *dst32;
if (buf_size < 4) { if (buf_size < 4) {
av_log(avctx, AV_LOG_ERROR, "PCM packet too small\n"); av_log(avctx, AV_LOG_ERROR, "PCM packet too small\n");
...@@ -148,15 +161,14 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, ...@@ -148,15 +161,14 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx,
sample_size = (num_source_channels * avctx->bits_per_coded_sample) >> 3; sample_size = (num_source_channels * avctx->bits_per_coded_sample) >> 3;
samples = buf_size / sample_size; samples = buf_size / sample_size;
output_size = samples * avctx->channels * /* get output buffer */
(avctx->sample_fmt == AV_SAMPLE_FMT_S32 ? 4 : 2); s->frame.nb_samples = samples;
if (output_size > *data_size) { if ((retval = avctx->get_buffer(avctx, &s->frame)) < 0) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
"Insufficient output buffer space (%d bytes, needed %d bytes)\n", return retval;
*data_size, output_size);
return -1;
} }
*data_size = output_size; dst16 = (int16_t *)s->frame.data[0];
dst32 = (int32_t *)s->frame.data[0];
if (samples) { if (samples) {
switch (avctx->channel_layout) { switch (avctx->channel_layout) {
...@@ -167,7 +179,7 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, ...@@ -167,7 +179,7 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx,
samples *= num_source_channels; samples *= num_source_channels;
if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) { if (AV_SAMPLE_FMT_S16 == avctx->sample_fmt) {
#if HAVE_BIGENDIAN #if HAVE_BIGENDIAN
memcpy(dst16, src, output_size); memcpy(dst16, src, buf_size);
#else #else
do { do {
*dst16++ = bytestream_get_be16(&src); *dst16++ = bytestream_get_be16(&src);
...@@ -291,10 +303,13 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx, ...@@ -291,10 +303,13 @@ static int pcm_bluray_decode_frame(AVCodecContext *avctx,
} }
} }
*got_frame_ptr = 1;
*(AVFrame *)data = s->frame;
retval = src - avpkt->data; retval = src - avpkt->data;
if (avctx->debug & FF_DEBUG_BITSTREAM) if (avctx->debug & FF_DEBUG_BITSTREAM)
av_dlog(avctx, "pcm_bluray_decode_frame: decoded %d -> %d bytes\n", av_dlog(avctx, "pcm_bluray_decode_frame: decoded %d -> %d bytes\n",
retval, *data_size); retval, buf_size);
return retval; return retval;
} }
...@@ -302,7 +317,10 @@ AVCodec ff_pcm_bluray_decoder = { ...@@ -302,7 +317,10 @@ AVCodec ff_pcm_bluray_decoder = {
.name = "pcm_bluray", .name = "pcm_bluray",
.type = AVMEDIA_TYPE_AUDIO, .type = AVMEDIA_TYPE_AUDIO,
.id = CODEC_ID_PCM_BLURAY, .id = CODEC_ID_PCM_BLURAY,
.priv_data_size = sizeof(PCMBRDecode),
.init = pcm_bluray_decode_init,
.decode = pcm_bluray_decode_frame, .decode = pcm_bluray_decode_frame,
.capabilities = CODEC_CAP_DR1,
.sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32,
AV_SAMPLE_FMT_NONE}, AV_SAMPLE_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("PCM signed 16|20|24-bit big-endian for Blu-ray media"), .long_name = NULL_IF_CONFIG_SMALL("PCM signed 16|20|24-bit big-endian for Blu-ray media"),
......
...@@ -616,8 +616,8 @@ static inline void write16x4(uint8_t *dst, int dst_stride, ...@@ -616,8 +616,8 @@ static inline void write16x4(uint8_t *dst, int dst_stride,
*(dst_int+15*int_dst_stride) = *(src_int + 15); *(dst_int+15*int_dst_stride) = *(src_int + 15);
} }
/** \brief performs a 6x16 transpose of data in src, and stores it to dst /** @brief performs a 6x16 transpose of data in src, and stores it to dst
\todo FIXME: see if we can't spare some vec_lvsl() by them factorizing @todo FIXME: see if we can't spare some vec_lvsl() by them factorizing
out of unaligned_load() */ out of unaligned_load() */
#define readAndTranspose16x6(src, src_stride, r8, r9, r10, r11, r12, r13) {\ #define readAndTranspose16x6(src, src_stride, r8, r9, r10, r11, r12, r13) {\
register vec_u8 r0 = unaligned_load(0, src); \ register vec_u8 r0 = unaligned_load(0, src); \
......
...@@ -94,7 +94,7 @@ do { \ ...@@ -94,7 +94,7 @@ do { \
} while (0) } while (0)
/** \brief loads unaligned vector \a *src with offset \a offset /** @brief loads unaligned vector @a *src with offset @a offset
and returns it */ and returns it */
static inline vector unsigned char unaligned_load(int offset, uint8_t *src) static inline vector unsigned char unaligned_load(int offset, uint8_t *src)
{ {
......
...@@ -58,7 +58,7 @@ void write_##type##_2d_array(const void *arg, int len, int len2)\ ...@@ -58,7 +58,7 @@ void write_##type##_2d_array(const void *arg, int len, int len2)\
/** /**
* @name Predefined functions for printing tables * @name Predefined functions for printing tables
* *
* \{ * @{
*/ */
void write_int8_t_array (const int8_t *, int); void write_int8_t_array (const int8_t *, int);
void write_uint8_t_array (const uint8_t *, int); void write_uint8_t_array (const uint8_t *, int);
...@@ -69,7 +69,7 @@ void write_int8_t_2d_array (const void *, int, int); ...@@ -69,7 +69,7 @@ void write_int8_t_2d_array (const void *, int, int);
void write_uint8_t_2d_array (const void *, int, int); void write_uint8_t_2d_array (const void *, int, int);
void write_uint32_t_2d_array(const void *, int, int); void write_uint32_t_2d_array(const void *, int, int);
void write_float_2d_array (const void *, int, int); void write_float_2d_array (const void *, int, int);
/** \} */ // end of printfuncs group /** @} */ // end of printfuncs group
#define WRITE_ARRAY(prefix, type, name) \ #define WRITE_ARRAY(prefix, type, name) \
do { \ do { \
......
...@@ -236,7 +236,7 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v) ...@@ -236,7 +236,7 @@ static void vc1_put_signed_blocks_clamped(VC1Context *v)
if (s->mb_x) { if (s->mb_x) {
topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1; topleft_mb_pos = (s->mb_y - 1) * s->mb_stride + s->mb_x - 1;
fieldtx = v->fieldtx_plane[topleft_mb_pos]; fieldtx = v->fieldtx_plane[topleft_mb_pos];
stride_y = (s->linesize) << fieldtx; stride_y = s->linesize << fieldtx;
v_dist = (16 - fieldtx) >> (fieldtx == 0); v_dist = (16 - fieldtx) >> (fieldtx == 0);
s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0], s->dsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][0],
s->dest[0] - 16 * s->linesize - 16, s->dest[0] - 16 * s->linesize - 16,
......
...@@ -115,9 +115,12 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m) ...@@ -115,9 +115,12 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m)
/* for pre-Windows 6.0 platforms we need to define and use our own condition /* for pre-Windows 6.0 platforms we need to define and use our own condition
* variable and api */ * variable and api */
typedef struct { typedef struct {
pthread_mutex_t mtx_broadcast;
pthread_mutex_t mtx_waiter_count; pthread_mutex_t mtx_waiter_count;
volatile int waiter_count; volatile int waiter_count;
HANDLE semaphore; HANDLE semaphore;
HANDLE waiters_done;
int is_broadcast;
} win32_cond_t; } win32_cond_t;
static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr) static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
...@@ -136,8 +139,12 @@ static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr) ...@@ -136,8 +139,12 @@ static void pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL); win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
if (!win32_cond->semaphore) if (!win32_cond->semaphore)
return; return;
win32_cond->waiters_done = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!win32_cond->waiters_done)
return;
pthread_mutex_init(&win32_cond->mtx_waiter_count, NULL); pthread_mutex_init(&win32_cond->mtx_waiter_count, NULL);
pthread_mutex_init(&win32_cond->mtx_broadcast, NULL);
} }
static void pthread_cond_destroy(pthread_cond_t *cond) static void pthread_cond_destroy(pthread_cond_t *cond)
...@@ -149,7 +156,9 @@ static void pthread_cond_destroy(pthread_cond_t *cond) ...@@ -149,7 +156,9 @@ static void pthread_cond_destroy(pthread_cond_t *cond)
/* non native condition variables */ /* non native condition variables */
CloseHandle(win32_cond->semaphore); CloseHandle(win32_cond->semaphore);
CloseHandle(win32_cond->waiters_done);
pthread_mutex_destroy(&win32_cond->mtx_waiter_count); pthread_mutex_destroy(&win32_cond->mtx_waiter_count);
pthread_mutex_destroy(&win32_cond->mtx_broadcast);
av_freep(&win32_cond); av_freep(&win32_cond);
cond->ptr = NULL; cond->ptr = NULL;
} }
...@@ -157,41 +166,70 @@ static void pthread_cond_destroy(pthread_cond_t *cond) ...@@ -157,41 +166,70 @@ static void pthread_cond_destroy(pthread_cond_t *cond)
static void pthread_cond_broadcast(pthread_cond_t *cond) static void pthread_cond_broadcast(pthread_cond_t *cond)
{ {
win32_cond_t *win32_cond = cond->ptr; win32_cond_t *win32_cond = cond->ptr;
int have_waiter;
if (cond_broadcast) { if (cond_broadcast) {
cond_broadcast(cond); cond_broadcast(cond);
return; return;
} }
/* non native condition variables */ /* non native condition variables */
pthread_mutex_lock(&win32_cond->mtx_broadcast);
pthread_mutex_lock(&win32_cond->mtx_waiter_count); pthread_mutex_lock(&win32_cond->mtx_waiter_count);
have_waiter = 0;
if (win32_cond->waiter_count) { if (win32_cond->waiter_count) {
ReleaseSemaphore(win32_cond->semaphore, win32_cond->waiter_count, NULL); win32_cond->is_broadcast = 1;
win32_cond->waiter_count = 0; have_waiter = 1;
} }
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
if (have_waiter) {
ReleaseSemaphore(win32_cond->semaphore, win32_cond->waiter_count, NULL);
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
WaitForSingleObject(win32_cond->waiters_done, INFINITE);
win32_cond->is_broadcast = 0;
} else
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
} }
static void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) static void pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
{ {
win32_cond_t *win32_cond = cond->ptr; win32_cond_t *win32_cond = cond->ptr;
int last_waiter;
if (cond_wait) { if (cond_wait) {
cond_wait(cond, mutex, INFINITE); cond_wait(cond, mutex, INFINITE);
return; return;
} }
/* non native condition variables */ /* non native condition variables */
pthread_mutex_lock(&win32_cond->mtx_broadcast);
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
pthread_mutex_lock(&win32_cond->mtx_waiter_count); pthread_mutex_lock(&win32_cond->mtx_waiter_count);
win32_cond->waiter_count++; win32_cond->waiter_count++;
pthread_mutex_unlock(&win32_cond->mtx_waiter_count); pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
// unlock the external mutex
pthread_mutex_unlock(mutex); pthread_mutex_unlock(mutex);
WaitForSingleObject(win32_cond->semaphore, INFINITE); WaitForSingleObject(win32_cond->semaphore, INFINITE);
pthread_mutex_lock(mutex);
pthread_mutex_lock(&win32_cond->mtx_waiter_count);
win32_cond->waiter_count--;
last_waiter = !win32_cond->waiter_count && win32_cond->is_broadcast;
pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
if (last_waiter)
SetEvent(win32_cond->waiters_done);
// lock the external mutex
return pthread_mutex_lock(mutex);
} }
static void pthread_cond_signal(pthread_cond_t *cond) static void pthread_cond_signal(pthread_cond_t *cond)
{ {
win32_cond_t *win32_cond = cond->ptr; win32_cond_t *win32_cond = cond->ptr;
int have_waiter;
if (cond_signal) { if (cond_signal) {
cond_signal(cond); cond_signal(cond);
return; return;
...@@ -199,11 +237,11 @@ static void pthread_cond_signal(pthread_cond_t *cond) ...@@ -199,11 +237,11 @@ static void pthread_cond_signal(pthread_cond_t *cond)
/* non-native condition variables */ /* non-native condition variables */
pthread_mutex_lock(&win32_cond->mtx_waiter_count); pthread_mutex_lock(&win32_cond->mtx_waiter_count);
if (win32_cond->waiter_count) { have_waiter = win32_cond->waiter_count;
ReleaseSemaphore(win32_cond->semaphore, 1, NULL);
win32_cond->waiter_count--;
}
pthread_mutex_unlock(&win32_cond->mtx_waiter_count); pthread_mutex_unlock(&win32_cond->mtx_waiter_count);
if (have_waiter)
ReleaseSemaphore(win32_cond->semaphore, 1, NULL);
} }
static void w32thread_init(void) static void w32thread_init(void)
......
...@@ -335,8 +335,8 @@ static int dc1394_read_packet(AVFormatContext *c, AVPacket *pkt) ...@@ -335,8 +335,8 @@ static int dc1394_read_packet(AVFormatContext *c, AVPacket *pkt)
res = dc1394_capture_dequeue(dc1394->camera, DC1394_CAPTURE_POLICY_WAIT, &dc1394->frame); res = dc1394_capture_dequeue(dc1394->camera, DC1394_CAPTURE_POLICY_WAIT, &dc1394->frame);
if (res == DC1394_SUCCESS) { if (res == DC1394_SUCCESS) {
dc1394->packet.data = (uint8_t *)(dc1394->frame->image); dc1394->packet.data = (uint8_t *) dc1394->frame->image;
dc1394->packet.pts = (dc1394->current_frame * 1000000) / (dc1394->frame_rate); dc1394->packet.pts = dc1394->current_frame * 1000000 / dc1394->frame_rate;
res = dc1394->frame->image_bytes; res = dc1394->frame->image_bytes;
} else { } else {
av_log(c, AV_LOG_ERROR, "DMA capture failed\n"); av_log(c, AV_LOG_ERROR, "DMA capture failed\n");
......
...@@ -33,9 +33,11 @@ ...@@ -33,9 +33,11 @@
#include "libavutil/file.h" #include "libavutil/file.h"
#include "libavutil/eval.h" #include "libavutil/eval.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/random_seed.h"
#include "libavutil/parseutils.h" #include "libavutil/parseutils.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "libavutil/tree.h" #include "libavutil/tree.h"
#include "libavutil/lfg.h"
#include "avfilter.h" #include "avfilter.h"
#include "drawutils.h" #include "drawutils.h"
...@@ -67,6 +69,22 @@ static const char * const var_names[] = { ...@@ -67,6 +69,22 @@ static const char * const var_names[] = {
NULL NULL
}; };
static const char *fun2_names[] = {
"rand",
};
static double drand(void *opaque, double min, double max)
{
return min + (max-min) / UINT_MAX * av_lfg_get(opaque);
}
typedef double (*eval_func2)(void *, double a, double b);
static const eval_func2 fun2[] = {
drand,
NULL
};
enum var_name { enum var_name {
VAR_MAIN_W, VAR_w, VAR_W, VAR_MAIN_W, VAR_w, VAR_W,
VAR_MAIN_H, VAR_h, VAR_H, VAR_MAIN_H, VAR_h, VAR_H,
...@@ -132,6 +150,10 @@ typedef struct { ...@@ -132,6 +150,10 @@ typedef struct {
AVExpr *x_pexpr, *y_pexpr; ///< parsed expressions for x and y AVExpr *x_pexpr, *y_pexpr; ///< parsed expressions for x and y
int64_t basetime; ///< base pts time in the real world for display int64_t basetime; ///< base pts time in the real world for display
double var_values[VAR_VARS_NB]; double var_values[VAR_VARS_NB];
char *d_expr;
AVExpr *d_pexpr;
int draw; ///< set to zero to prevent drawing
AVLFG prng; ///< random
} DrawTextContext; } DrawTextContext;
#define OFFSET(x) offsetof(DrawTextContext, x) #define OFFSET(x) offsetof(DrawTextContext, x)
...@@ -151,7 +173,7 @@ static const AVOption drawtext_options[]= { ...@@ -151,7 +173,7 @@ static const AVOption drawtext_options[]= {
{"shadowy", "set y", OFFSET(shadowy), AV_OPT_TYPE_INT, {.dbl=0}, INT_MIN, INT_MAX }, {"shadowy", "set y", OFFSET(shadowy), AV_OPT_TYPE_INT, {.dbl=0}, INT_MIN, INT_MAX },
{"tabsize", "set tab size", OFFSET(tabsize), AV_OPT_TYPE_INT, {.dbl=4}, 0, INT_MAX }, {"tabsize", "set tab size", OFFSET(tabsize), AV_OPT_TYPE_INT, {.dbl=4}, 0, INT_MAX },
{"basetime", "set base time", OFFSET(basetime), AV_OPT_TYPE_INT64, {.dbl=AV_NOPTS_VALUE}, INT64_MIN, INT64_MAX }, {"basetime", "set base time", OFFSET(basetime), AV_OPT_TYPE_INT64, {.dbl=AV_NOPTS_VALUE}, INT64_MIN, INT64_MAX },
{"draw", "if false do not draw", OFFSET(d_expr), AV_OPT_TYPE_STRING, {.str="1"}, CHAR_MIN, CHAR_MAX },
/* FT_LOAD_* flags */ /* FT_LOAD_* flags */
{"ft_load_flags", "set font loading flags for libfreetype", OFFSET(ft_load_flags), AV_OPT_TYPE_FLAGS, {.dbl=FT_LOAD_DEFAULT|FT_LOAD_RENDER}, 0, INT_MAX, 0, "ft_load_flags" }, {"ft_load_flags", "set font loading flags for libfreetype", OFFSET(ft_load_flags), AV_OPT_TYPE_FLAGS, {.dbl=FT_LOAD_DEFAULT|FT_LOAD_RENDER}, 0, INT_MAX, 0, "ft_load_flags" },
...@@ -470,10 +492,15 @@ static int config_input(AVFilterLink *inlink) ...@@ -470,10 +492,15 @@ static int config_input(AVFilterLink *inlink)
dtext->var_values[VAR_N] = 0; dtext->var_values[VAR_N] = 0;
dtext->var_values[VAR_T] = NAN; dtext->var_values[VAR_T] = NAN;
av_lfg_init(&dtext->prng, av_get_random_seed());
if ((ret = av_expr_parse(&dtext->x_pexpr, dtext->x_expr, var_names, if ((ret = av_expr_parse(&dtext->x_pexpr, dtext->x_expr, var_names,
NULL, NULL, NULL, NULL, 0, ctx)) < 0 || NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 ||
(ret = av_expr_parse(&dtext->y_pexpr, dtext->y_expr, var_names, (ret = av_expr_parse(&dtext->y_pexpr, dtext->y_expr, var_names,
NULL, NULL, NULL, NULL, 0, ctx)) < 0) NULL, NULL, fun2_names, fun2, 0, ctx)) < 0 ||
(ret = av_expr_parse(&dtext->d_pexpr, dtext->d_expr, var_names,
NULL, NULL, fun2_names, fun2, 0, ctx)) < 0)
return AVERROR(EINVAL); return AVERROR(EINVAL);
return 0; return 0;
...@@ -761,9 +788,13 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref, ...@@ -761,9 +788,13 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
dtext->var_values[VAR_LINE_H] = dtext->var_values[VAR_LH] = dtext->max_glyph_h; dtext->var_values[VAR_LINE_H] = dtext->var_values[VAR_LH] = dtext->max_glyph_h;
dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL); dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng);
dtext->y = dtext->var_values[VAR_Y] = av_expr_eval(dtext->y_pexpr, dtext->var_values, NULL); dtext->y = dtext->var_values[VAR_Y] = av_expr_eval(dtext->y_pexpr, dtext->var_values, &dtext->prng);
dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, NULL); dtext->x = dtext->var_values[VAR_X] = av_expr_eval(dtext->x_pexpr, dtext->var_values, &dtext->prng);
dtext->draw = av_expr_eval(dtext->d_pexpr, dtext->var_values, &dtext->prng);
if(!dtext->draw)
return 0;
dtext->x &= ~((1 << dtext->hsub) - 1); dtext->x &= ~((1 << dtext->hsub) - 1);
dtext->y &= ~((1 << dtext->vsub) - 1); dtext->y &= ~((1 << dtext->vsub) - 1);
......
...@@ -75,6 +75,7 @@ typedef struct RTMPContext { ...@@ -75,6 +75,7 @@ typedef struct RTMPContext {
uint8_t flv_header[11]; ///< partial incoming flv packet header uint8_t flv_header[11]; ///< partial incoming flv packet header
int flv_header_bytes; ///< number of initialized bytes in flv_header int flv_header_bytes; ///< number of initialized bytes in flv_header
int nb_invokes; ///< keeps track of invoke messages int nb_invokes; ///< keeps track of invoke messages
int create_stream_invoke; ///< invoke id for the create stream command
} RTMPContext; } RTMPContext;
#define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing #define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing
...@@ -115,7 +116,7 @@ static void gen_connect(URLContext *s, RTMPContext *rt, const char *proto, ...@@ -115,7 +116,7 @@ static void gen_connect(URLContext *s, RTMPContext *rt, const char *proto,
ff_url_join(tcurl, sizeof(tcurl), proto, NULL, host, port, "/%s", rt->app); ff_url_join(tcurl, sizeof(tcurl), proto, NULL, host, port, "/%s", rt->app);
ff_amf_write_string(&p, "connect"); ff_amf_write_string(&p, "connect");
ff_amf_write_number(&p, 1.0); ff_amf_write_number(&p, ++rt->nb_invokes);
ff_amf_write_object_start(&p); ff_amf_write_object_start(&p);
ff_amf_write_field_name(&p, "app"); ff_amf_write_field_name(&p, "app");
ff_amf_write_string(&p, rt->app); ff_amf_write_string(&p, rt->app);
...@@ -237,6 +238,7 @@ static void gen_create_stream(URLContext *s, RTMPContext *rt) ...@@ -237,6 +238,7 @@ static void gen_create_stream(URLContext *s, RTMPContext *rt)
ff_amf_write_string(&p, "createStream"); ff_amf_write_string(&p, "createStream");
ff_amf_write_number(&p, ++rt->nb_invokes); ff_amf_write_number(&p, ++rt->nb_invokes);
ff_amf_write_null(&p); ff_amf_write_null(&p);
rt->create_stream_invoke = rt->nb_invokes;
ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]); ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
ff_rtmp_packet_destroy(&pkt); ff_rtmp_packet_destroy(&pkt);
...@@ -257,7 +259,7 @@ static void gen_delete_stream(URLContext *s, RTMPContext *rt) ...@@ -257,7 +259,7 @@ static void gen_delete_stream(URLContext *s, RTMPContext *rt)
p = pkt.data; p = pkt.data;
ff_amf_write_string(&p, "deleteStream"); ff_amf_write_string(&p, "deleteStream");
ff_amf_write_number(&p, 0.0); ff_amf_write_number(&p, ++rt->nb_invokes);
ff_amf_write_null(&p); ff_amf_write_null(&p);
ff_amf_write_number(&p, rt->main_channel_id); ff_amf_write_number(&p, rt->main_channel_id);
...@@ -281,7 +283,7 @@ static void gen_play(URLContext *s, RTMPContext *rt) ...@@ -281,7 +283,7 @@ static void gen_play(URLContext *s, RTMPContext *rt)
p = pkt.data; p = pkt.data;
ff_amf_write_string(&p, "play"); ff_amf_write_string(&p, "play");
ff_amf_write_number(&p, 0.0); ff_amf_write_number(&p, ++rt->nb_invokes);
ff_amf_write_null(&p); ff_amf_write_null(&p);
ff_amf_write_string(&p, rt->playpath); ff_amf_write_string(&p, rt->playpath);
...@@ -315,7 +317,7 @@ static void gen_publish(URLContext *s, RTMPContext *rt) ...@@ -315,7 +317,7 @@ static void gen_publish(URLContext *s, RTMPContext *rt)
p = pkt.data; p = pkt.data;
ff_amf_write_string(&p, "publish"); ff_amf_write_string(&p, "publish");
ff_amf_write_number(&p, 0.0); ff_amf_write_number(&p, ++rt->nb_invokes);
ff_amf_write_null(&p); ff_amf_write_null(&p);
ff_amf_write_string(&p, rt->playpath); ff_amf_write_string(&p, rt->playpath);
ff_amf_write_string(&p, "live"); ff_amf_write_string(&p, "live");
...@@ -614,7 +616,7 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt) ...@@ -614,7 +616,7 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt)
* releaseStream and FCPublish calls */ * releaseStream and FCPublish calls */
if (!pkt->data[10]) { if (!pkt->data[10]) {
int pkt_id = (int) av_int2dbl(AV_RB64(pkt->data + 11)); int pkt_id = (int) av_int2dbl(AV_RB64(pkt->data + 11));
if (pkt_id == 4) if (pkt_id == rt->create_stream_invoke)
rt->state = STATE_CONNECTING; rt->state = STATE_CONNECTING;
} }
if (rt->state != STATE_CONNECTING) if (rt->state != STATE_CONNECTING)
......
...@@ -2247,7 +2247,6 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option ...@@ -2247,7 +2247,6 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **option
pkt.size -= ret; pkt.size -= ret;
} }
} }
fail:
return ret; return ret;
} }
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#include <stdint.h> #include <stdint.h>
/** @name Error flags returned by av_lzo1x_decode /** @name Error flags returned by av_lzo1x_decode
* \{ */ * @{ */
/// end of the input buffer reached before decoding finished /// end of the input buffer reached before decoding finished
#define AV_LZO_INPUT_DEPLETED 1 #define AV_LZO_INPUT_DEPLETED 1
/// decoded data did not fit into output buffer /// decoded data did not fit into output buffer
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#define AV_LZO_INVALID_BACKPTR 4 #define AV_LZO_INVALID_BACKPTR 4
/// a non-specific error in the compressed bitstream /// a non-specific error in the compressed bitstream
#define AV_LZO_ERROR 8 #define AV_LZO_ERROR 8
/** \} */ /** @} */
#define AV_LZO_INPUT_PADDING 8 #define AV_LZO_INPUT_PADDING 8
#define AV_LZO_OUTPUT_PADDING 12 #define AV_LZO_OUTPUT_PADDING 12
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment