[FFmpeg-devel] [PATCH 4/6] Implement and use transpose function.
Stefano Sabatini
stefano.sabatini-lala
Fri Oct 15 01:13:48 CEST 2010
---
libavfilter/vf_transpose.c | 108 ++++++++++++++++++++++++-------------------
1 files changed, 60 insertions(+), 48 deletions(-)
diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c
index 78a408b..8f18cd7 100644
--- a/libavfilter/vf_transpose.c
+++ b/libavfilter/vf_transpose.c
@@ -29,6 +29,63 @@
#include "libavcore/imgutils.h"
#include "avfilter.h"
+static void transpose(uint8_t *dst[4], int dst_linesizes[4],
+ uint8_t *src[4], int src_linesizes[4],
+ int dstw, int dsth,
+ int pixsteps[4], int hsub, int vsub,
+ int dir)
+{
+ int plane;
+
+ for (plane = 0; plane < 4 && dst[plane]; plane++) {
+ int hsub1 = plane == 1 || plane == 2 ? hsub : 0;
+ int vsub1 = plane == 1 || plane == 2 ? vsub : 0;
+ int pixstep = pixsteps[plane];
+ int inh = dstw>>vsub1;
+ int outw = dstw>>hsub1;
+ int outh = dsth>>vsub1;
+ uint8_t *out, *in;
+ int outlinesize, inlinesize;
+ int x, y;
+
+ out = dst[plane]; outlinesize = dst_linesizes[plane];
+ in = src[plane]; inlinesize = src_linesizes[plane];
+
+ if (dir&1) {
+ in += src_linesizes[plane] * (inh-1);
+ inlinesize *= -1;
+ }
+
+ if (dir&2) {
+ out += dst_linesizes[plane] * (outh-1);
+ outlinesize *= -1;
+ }
+
+ for (y = 0; y < outh; y++) {
+ for (x = 0; x < outw; x++) {
+ int32_t v;
+
+ switch (pixstep) {
+ case 1:
+ *(out + x) = *(in + x*inlinesize + y);
+ break;
+ case 2:
+ *((uint16_t *)(out + 2*x)) = *((uint16_t *)(in + x*inlinesize + y*2));
+ break;
+ case 3:
+ v = AV_RB24(in + x*inlinesize + y*3);
+ AV_WB24(out + 3*x, v);
+ break;
+ case 4:
+ *((uint32_t *)(out + 4*x)) = *((uint32_t *)(in + x*inlinesize + y*4));
+ break;
+ }
+ }
+ out += outlinesize;
+ }
+ }
+}
+
typedef struct {
int hsub, vsub;
int nb_planes;
@@ -121,55 +178,10 @@ static void end_frame(AVFilterLink *inlink)
AVFilterBufferRef *inpic = inlink->cur_buf;
AVFilterBufferRef *outpic = inlink->dst->outputs[0]->out_buf;
AVFilterLink *outlink = inlink->dst->outputs[0];
- int plane;
-
- for (plane = 0; plane < trans->nb_planes; plane++) {
- int hsub = plane == 1 || plane == 2 ? trans->hsub : 0;
- int vsub = plane == 1 || plane == 2 ? trans->vsub : 0;
- int pixstep = trans->pixsteps[plane];
- int inh = inpic->video->h>>vsub;
- int outw = outpic->video->w>>hsub;
- int outh = outpic->video->h>>vsub;
- uint8_t *out, *in;
- int outlinesize, inlinesize;
- int x, y;
-
- out = outpic->data[plane]; outlinesize = outpic->linesize[plane];
- in = inpic ->data[plane]; inlinesize = inpic ->linesize[plane];
- if (trans->dir&1) {
- in += inpic->linesize[plane] * (inh-1);
- inlinesize *= -1;
- }
-
- if (trans->dir&2) {
- out += outpic->linesize[plane] * (outh-1);
- outlinesize *= -1;
- }
-
- for (y = 0; y < outh; y++) {
- for (x = 0; x < outw; x++) {
- int32_t v;
-
- switch (pixstep) {
- case 1:
- *(out + x) = *(in + x*inlinesize + y);
- break;
- case 2:
- *((uint16_t *)(out + 2*x)) = *((uint16_t *)(in + x*inlinesize + y*2));
- break;
- case 3:
- v = AV_RB24(in + x*inlinesize + y*3);
- AV_WB24(out + 3*x, v);
- break;
- case 4:
- *((uint32_t *)(out + 4*x)) = *((uint32_t *)(in + x*inlinesize + y*4));
- break;
- }
- }
- out += outlinesize;
- }
- }
+ transpose(outpic->data, outpic->linesize, inpic->data, inpic->linesize,
+ outpic->video->w, outpic->video->h, trans->pixsteps,
+ trans->hsub, trans->vsub, trans->dir);
avfilter_unref_buffer(inpic);
avfilter_draw_slice(outlink, 0, outpic->video->h, 1);
--
1.7.1
More information about the ffmpeg-devel
mailing list