diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-16 01:32:52 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-16 01:32:52 +0200 |
commit | fbe02459dc4f3c8f4d758c1a90ed8e35a800f3b9 (patch) | |
tree | 66263011ff0784ce9a33b697a117516de48401fa /libavcodec/vp8.h | |
parent | 9a1963fbb872f08222a5b73fe96931708ca32732 (diff) | |
parent | b4675d0fbf6606ab737e81c3c0fe6a05c8764334 (diff) | |
download | ffmpeg-fbe02459dc4f3c8f4d758c1a90ed8e35a800f3b9.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
configure: Check for CommandLineToArgvW
vc1dec: Do not use random pred_flag if motion vector data is skipped
vp8: Enclose pthread function calls in ifdefs
snow: refactor code to work around a compiler bug in MSVC.
vp8: Include the thread headers before using the pthread types
configure: Check for getaddrinfo in ws2tcpip.h, too
vp8: implement sliced threading
vp8: move data from VP8Context->VP8Macroblock
vp8: refactor decoding a single mb_row
doc: update api changes with the right commit hashes
mem: introduce av_malloc_array and av_mallocz_array
Conflicts:
configure
doc/APIchanges
libavcodec/vp8.c
libavutil/mem.h
libavutil/version.h
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/vp8.h')
-rw-r--r-- | libavcodec/vp8.h | 77 |
1 files changed, 50 insertions, 27 deletions
diff --git a/libavcodec/vp8.h b/libavcodec/vp8.h index 5d2a3b773d..23d62af7fa 100644 --- a/libavcodec/vp8.h +++ b/libavcodec/vp8.h @@ -4,6 +4,7 @@ * Copyright (C) 2010 David Conrad * Copyright (C) 2010 Ronald S. Bultje * Copyright (C) 2010 Jason Garrett-Glaser + * Copyright (C) 2012 Daniel Kang * * This file is part of FFmpeg. * @@ -29,6 +30,11 @@ #include "vp56data.h" #include "vp8dsp.h" #include "h264pred.h" +#if HAVE_PTHREADS +#include <pthread.h> +#elif HAVE_W32THREADS +#include "w32pthreads.h" +#endif #define VP8_MAX_QUANT 127 @@ -79,15 +85,51 @@ typedef struct { uint8_t mode; uint8_t ref_frame; uint8_t partitioning; + uint8_t chroma_pred_mode; + uint8_t segment; + uint8_t intra4x4_pred_mode_mb[16]; + uint8_t intra4x4_pred_mode_top[4]; VP56mv mv; VP56mv bmv[16]; } VP8Macroblock; typedef struct { +#if HAVE_THREADS + pthread_mutex_t lock; + pthread_cond_t cond; +#endif + int thread_nr; + int thread_mb_pos; // (mb_y << 16) | (mb_x & 0xFFFF) + int wait_mb_pos; // What the current thread is waiting on. + uint8_t *edge_emu_buffer; + /** + * For coeff decode, we need to know whether the above block had non-zero + * coefficients. This means for each macroblock, we need data for 4 luma + * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9 + * per macroblock. We keep the last row in top_nnz. + */ + DECLARE_ALIGNED(8, uint8_t, left_nnz)[9]; + /** + * This is the index plus one of the last non-zero coeff + * for each of the blocks in the current macroblock. + * So, 0 -> no coeffs + * 1 -> dc-only (special transform) + * 2+-> full transform + */ + DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4]; + DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16]; + DECLARE_ALIGNED(16, DCTELEM, block_dc)[16]; + VP8FilterStrength *filter_strength; +} VP8ThreadData; + +#define MAX_THREADS 8 +typedef struct { + VP8ThreadData *thread_data; AVCodecContext *avctx; AVFrame *framep[4]; AVFrame *next_framep[4]; - uint8_t *edge_emu_buffer; + AVFrame *curframe; + AVFrame *prev_frame; uint16_t mb_width; /* number of horizontal MB */ uint16_t mb_height; /* number of vertical MB */ @@ -97,8 +139,6 @@ typedef struct { uint8_t keyframe; uint8_t deblock_filter; uint8_t mbskip_enabled; - uint8_t segment; ///< segment of the current macroblock - uint8_t chroma_pred_mode; ///< 8x8c pred mode of the current macroblock uint8_t profile; VP56mv mv_min; VP56mv mv_max; @@ -126,7 +166,6 @@ typedef struct { } filter; VP8Macroblock *macroblocks; - VP8FilterStrength *filter_strength; uint8_t *intra4x4_pred_mode_top; uint8_t intra4x4_pred_mode_left[4]; @@ -167,33 +206,10 @@ typedef struct { int8_t ref[4]; } lf_delta; - /** - * Cache of the top row needed for intra prediction - * 16 for luma, 8 for each chroma plane - */ uint8_t (*top_border)[16+8+8]; - - /** - * For coeff decode, we need to know whether the above block had non-zero - * coefficients. This means for each macroblock, we need data for 4 luma - * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9 - * per macroblock. We keep the last row in top_nnz. - */ uint8_t (*top_nnz)[9]; - DECLARE_ALIGNED(8, uint8_t, left_nnz)[9]; - /** - * This is the index plus one of the last non-zero coeff - * for each of the blocks in the current macroblock. - * So, 0 -> no coeffs - * 1 -> dc-only (special transform) - * 2+-> full transform - */ - DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4]; VP56RangeCoder c; ///< header context, includes mb modes and motion vectors - DECLARE_ALIGNED(16, DCTELEM, block)[6][4][16]; - DECLARE_ALIGNED(16, DCTELEM, block_dc)[16]; - uint8_t intra4x4_pred_mode_mb[16]; /** * These are all of the updatable probabilities for binary decisions. @@ -246,6 +262,13 @@ typedef struct { uint8_t *segmentation_maps[5]; int num_maps_to_be_freed; int maps_are_invalid; + int num_jobs; + /** + * This describes the macroblock memory layout. + * 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread). + * 1 -> Macroblocks for entire frame alloced (sliced thread). + */ + int mb_layout; } VP8Context; #endif /* AVCODEC_VP8_H */ |