/***************************************************************************** * ffmpeg_CopyPicture: copy a picture from ffmpeg internal buffers to a * picture_t structure (when not in direct rendering mode). *****************************************************************************/ static void ffmpeg_CopyPicture( decoder_t *p_dec, picture_t *p_pic, AVFrame *p_ff_pic ) { decoder_sys_t *p_sys = p_dec->p_sys; if( p_sys->p_va ) { vlc_va_Extract( p_sys->p_va, p_pic, p_ff_pic->opaque, p_ff_pic->data[3] ); } else if( FindVlcChroma( p_sys->p_context->pix_fmt ) ) { int i_plane, i_size, i_line; uint8_t *p_dst, *p_src; int i_src_stride, i_dst_stride; if( p_sys->p_context->pix_fmt == PIX_FMT_PAL8 ) { if( !p_pic->format.p_palette ) p_pic->format.p_palette = calloc( 1, sizeof(video_palette_t) ); if( p_pic->format.p_palette ) { p_pic->format.p_palette->i_entries = AVPALETTE_COUNT; memcpy( p_pic->format.p_palette->palette, p_ff_pic->data[1], AVPALETTE_SIZE ); } } for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ ) { p_src = p_ff_pic->data[i_plane]; p_dst = p_pic->p[i_plane].p_pixels; i_src_stride = p_ff_pic->linesize[i_plane]; i_dst_stride = p_pic->p[i_plane].i_pitch; i_size = __MIN( i_src_stride, i_dst_stride ); for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines; i_line++ ) { memcpy( p_dst, p_src, i_size ); p_src += i_src_stride; p_dst += i_dst_stride; } } } else { const char *name = av_get_pix_fmt_name( p_sys->p_context->pix_fmt ); msg_Err( p_dec, "Unsupported decoded output format %d (%s)", p_sys->p_context->pix_fmt, name ? name : "unknown" ); p_dec->b_error = 1; } }
/** * Copies a picture from the libavcodec-allocate buffer to a picture_t. * This is used when not in direct rendering mode. */ static void lavc_CopyPicture(decoder_t *dec, picture_t *pic, AVFrame *frame) { decoder_sys_t *sys = dec->p_sys; if (!FindVlcChroma(sys->p_context->pix_fmt)) { const char *name = av_get_pix_fmt_name(sys->p_context->pix_fmt); msg_Err(dec, "Unsupported decoded output format %d (%s)", sys->p_context->pix_fmt, (name != NULL) ? name : "unknown"); dec->b_error = true; return; } for (int plane = 0; plane < pic->i_planes; plane++) { const uint8_t *src = frame->data[plane]; uint8_t *dst = pic->p[plane].p_pixels; size_t src_stride = frame->linesize[plane]; size_t dst_stride = pic->p[plane].i_pitch; size_t size = __MIN(src_stride, dst_stride); for (int line = 0; line < pic->p[plane].i_visible_lines; line++) { memcpy(dst, src, size); src += src_stride; dst += dst_stride; } } if (unlikely(sys->p_context->pix_fmt == PIX_FMT_PAL8)) { if (pic->format.p_palette == NULL) pic->format.p_palette = calloc(1, sizeof (video_palette_t)); if (likely(pic->format.p_palette != NULL)) { pic->format.p_palette->i_entries = AVPALETTE_COUNT; memcpy(pic->format.p_palette->palette, frame->data[1], AVPALETTE_SIZE); } } }
/***************************************************************************** * ffmpeg_CopyPicture: copy a picture from ffmpeg internal buffers to a * picture_t structure (when not in direct rendering mode). *****************************************************************************/ static void ffmpeg_CopyPicture( decoder_t *p_dec, picture_t *p_pic, AVFrame *p_ff_pic ) { decoder_sys_t *p_sys = p_dec->p_sys; if( p_sys->p_va ) { vlc_va_Extract( p_sys->p_va, p_pic, p_ff_pic ); } else if( FindVlcChroma( p_sys->p_context->pix_fmt ) ) { int i_plane, i_size, i_line; uint8_t *p_dst, *p_src; int i_src_stride, i_dst_stride; for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ ) { p_src = p_ff_pic->data[i_plane]; p_dst = p_pic->p[i_plane].p_pixels; i_src_stride = p_ff_pic->linesize[i_plane]; i_dst_stride = p_pic->p[i_plane].i_pitch; i_size = __MIN( i_src_stride, i_dst_stride ); for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines; i_line++ ) { memcpy( p_dst, p_src, i_size ); p_src += i_src_stride; p_dst += i_dst_stride; } } } else { const char *name = av_get_pix_fmt_name( p_sys->p_context->pix_fmt ); msg_Err( p_dec, "Unsupported decoded output format %d (%s)", p_sys->p_context->pix_fmt, name ? name : "unknown" ); p_dec->b_error = 1; } }