s->picture_range_start = 0;
s->picture_range_end = MAX_PICTURE_COUNT;
+
+ s->slice_context_count = 1;
}
/**
*/
av_cold int MPV_common_init(MpegEncContext *s)
{
- int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y,
- threads = (s->encoding ||
- (HAVE_THREADS &&
- s->avctx->active_thread_type & FF_THREAD_SLICE)) ?
- s->avctx->thread_count : 1;
+ int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
+ int nb_slices = (HAVE_THREADS &&
+ s->avctx->active_thread_type & FF_THREAD_SLICE) ?
+ s->avctx->thread_count : 1;
+
+ if (s->encoding && s->avctx->slices)
+ nb_slices = s->avctx->slices;
if (s->codec_id == CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
s->mb_height = (s->height + 31) / 32 * 2;
return -1;
}
- if ((s->encoding || (s->avctx->active_thread_type & FF_THREAD_SLICE)) &&
- (s->avctx->thread_count > MAX_THREADS ||
- (s->avctx->thread_count > s->mb_height && s->mb_height))) {
- int max_threads = FFMIN(MAX_THREADS, s->mb_height);
- av_log(s->avctx, AV_LOG_WARNING,
- "too many threads (%d), reducing to %d\n",
- s->avctx->thread_count, max_threads);
- threads = max_threads;
+ if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
+ int max_slices;
+ if (s->mb_height)
+ max_slices = FFMIN(MAX_THREADS, s->mb_height);
+ else
+ max_slices = MAX_THREADS;
+ av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
+ " reducing to %d\n", nb_slices, max_slices);
+ nb_slices = max_slices;
}
if ((s->width || s->height) &&
mb_array_size = s->mb_height * s->mb_stride;
mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
- /* set chroma shifts */
- avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,&(s->chroma_x_shift),
- &(s->chroma_y_shift) );
+ /* set chroma shifts */
+ avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift,
+ &s->chroma_y_shift);
/* set default edge pos, will be overriden in decode_header if needed */
s->h_edge_pos = s->mb_width * 16;
// Note the + 1 is for a quicker mpeg4 slice_end detection
s->parse_context.state = -1;
- if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
- s->avctx->debug_mv) {
- s->visualization_buffer[0] = av_malloc((s->mb_width * 16 +
- 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->thread_context[0] = s;
- if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type&FF_THREAD_SLICE)) {
- for (i = 1; i < threads; i++) {
+// if (s->width && s->height) {
+ if (nb_slices > 1) {
+ for (i = 1; i < nb_slices; i++) {
s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
memcpy(s->thread_context[i], s, sizeof(MpegEncContext));
}
- for (i = 0; i < threads; i++) {
+ for (i = 0; i < nb_slices; i++) {
if (init_duplicate_context(s->thread_context[i], s) < 0)
goto fail;
- s->thread_context[i]->start_mb_y = (s->mb_height*(i ) + s->avctx->thread_count / 2) / s->avctx->thread_count;
- s->thread_context[i]->end_mb_y = (s->mb_height*(i+1) + s->avctx->thread_count / 2) / s->avctx->thread_count;
+ s->thread_context[i]->start_mb_y =
+ (s->mb_height * (i) + nb_slices / 2) / nb_slices;
+ s->thread_context[i]->end_mb_y =
+ (s->mb_height * (i + 1) + nb_slices / 2) / nb_slices;
}
} else {
if (init_duplicate_context(s, s) < 0)
s->start_mb_y = 0;
s->end_mb_y = s->mb_height;
}
+ s->slice_context_count = nb_slices;
+// }
return 0;
fail:
{
int i, j, k;
- if (s->encoding || (HAVE_THREADS && s->avctx->active_thread_type & FF_THREAD_SLICE)) {
- for (i = 0; i < s->avctx->thread_count; i++) {
+ if (s->slice_context_count > 1) {
+ for (i = 0; i < s->slice_context_count; i++) {
free_duplicate_context(s->thread_context[i]);
}
- for (i = 1; i < s->avctx->thread_count; i++) {
+ for (i = 1; i < s->slice_context_count; i++) {
av_freep(&s->thread_context[i]);
}
+ s->slice_context_count = 1;
} else free_duplicate_context(s);
av_freep(&s->parse_context.buffer);
avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,
&h_chroma_shift, &v_chroma_shift);
for (i = 0; i < 3; i++) {
- memcpy(s->visualization_buffer[i], pict->data[i],
- (i == 0) ? pict->linesize[i] * height:
- pict->linesize[i] * height >> v_chroma_shift);
+ size_t size= (i == 0) ? pict->linesize[i] * height:
+ pict->linesize[i] * height >> v_chroma_shift;
+ s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
+ memcpy(s->visualization_buffer[i], pict->data[i], size);
pict->data[i] = s->visualization_buffer[i];
}
pict->type = FF_BUFFER_TYPE_COPY;
}
dct_linesize = linesize << s->interlaced_dct;
- dct_offset =(s->interlaced_dct)? linesize : linesize*block_size;
+ dct_offset = s->interlaced_dct ? linesize : linesize * block_size;
if(readable){
dest_y= s->dest[0];
}else{
//chroma422
dct_linesize = uvlinesize << s->interlaced_dct;
- dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*block_size;
+ dct_offset = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
add_dct(s, block[4], 4, dest_cb, dct_linesize);
add_dct(s, block[5], 5, dest_cr, dct_linesize);
}else{
dct_linesize = uvlinesize << s->interlaced_dct;
- dct_offset =(s->interlaced_dct)? uvlinesize : uvlinesize*block_size;
+ dct_offset = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
s->dsp.idct_put(dest_cb, dct_linesize, block[4]);
s->dsp.idct_put(dest_cr, dct_linesize, block[5]);