Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56ae24aa authored by Hans de Goede's avatar Hans de Goede Committed by Mauro Carvalho Chehab
Browse files

[media] pwc: Make decoder data part of the main pwc struct

parent 54d3fb3b
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -213,9 +213,7 @@ static int set_video_mode_Nala(struct pwc_device *pdev, int size, int frames,
		return ret;
	}
	if (pEntry->compressed && pdev->pixfmt == V4L2_PIX_FMT_YUV420) {
		ret = pwc_dec1_init(pdev, pdev->type, pdev->release, buf);
		if (ret < 0)
			return ret;
		pwc_dec1_init(pdev, buf);
	}

	pdev->cmd_len = 3;
@@ -281,9 +279,7 @@ static int set_video_mode_Timon(struct pwc_device *pdev, int size, int frames,
		return ret;

	if (pChoose->bandlength > 0 && pdev->pixfmt == V4L2_PIX_FMT_YUV420) {
		ret = pwc_dec23_init(pdev, pdev->type, buf);
		if (ret < 0)
			return ret;
		pwc_dec23_init(pdev, buf);
	}

	pdev->cmd_len = 13;
@@ -341,9 +337,7 @@ static int set_video_mode_Kiara(struct pwc_device *pdev, int size, int frames,
		return ret;

	if (pChoose->bandlength > 0 && pdev->pixfmt == V4L2_PIX_FMT_YUV420) {
		ret = pwc_dec23_init(pdev, pdev->type, buf);
		if (ret < 0)
			return ret;
		pwc_dec23_init(pdev, buf);
	}

	pdev->cmd_len = 12;
@@ -368,7 +362,8 @@ int pwc_set_video_mode(struct pwc_device *pdev, int width, int height,
{
	int ret, size;

	PWC_DEBUG_FLOW("set_video_mode(%dx%d @ %d, pixfmt %08x).\n", width, height, frames, pdev->pixfmt);
	PWC_DEBUG_FLOW("set_video_mode(%dx%d @ %d, pixfmt %08x).\n",
		       width, height, frames, pdev->pixfmt);
	size = pwc_get_size(pdev, width, height);
	PWC_TRACE("decode_size = %d.\n", size);

+4 −12
Original line number Diff line number Diff line
@@ -22,19 +22,11 @@
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
#include "pwc-dec1.h"
#include "pwc.h"

int pwc_dec1_init(struct pwc_device *pwc, int type, int release, void *buffer)
void pwc_dec1_init(struct pwc_device *pdev, void *buffer)
{
	struct pwc_dec1_private *pdec;
	struct pwc_dec1_private *pdec = &pdev->dec1;

	if (pwc->decompress_data == NULL) {
		pdec = kmalloc(sizeof(struct pwc_dec1_private), GFP_KERNEL);
		if (pdec == NULL)
			return -ENOMEM;
		pwc->decompress_data = pdec;
	}
	pdec = pwc->decompress_data;

	return 0;
	pdec->version = pdev->release;
}
+4 −2
Original line number Diff line number Diff line
@@ -25,13 +25,15 @@
#ifndef PWC_DEC1_H
#define PWC_DEC1_H

#include "pwc.h"
#include <linux/mutex.h>

struct pwc_device;

struct pwc_dec1_private
{
	int version;
};

int pwc_dec1_init(struct pwc_device *pwc, int type, int release, void *buffer);
void pwc_dec1_init(struct pwc_device *pdev, void *buffer);

#endif
+13 −24
Original line number Diff line number Diff line
@@ -294,22 +294,14 @@ static unsigned char pwc_crop_table[256 + 2*MAX_OUTER_CROP_VALUE];


/* If the type or the command change, we rebuild the lookup table */
int pwc_dec23_init(struct pwc_device *pwc, int type, unsigned char *cmd)
void pwc_dec23_init(struct pwc_device *pdev, unsigned char *cmd)
{
	int flags, version, shift, i;
	struct pwc_dec23_private *pdec;

	if (pwc->decompress_data == NULL) {
		pdec = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL);
		if (pdec == NULL)
			return -ENOMEM;
		pwc->decompress_data = pdec;
	}
	pdec = pwc->decompress_data;
	struct pwc_dec23_private *pdec = &pdev->dec23;

	mutex_init(&pdec->lock);

	if (DEVICE_USE_CODEC3(type)) {
	if (DEVICE_USE_CODEC3(pdev->type)) {
		flags = cmd[2] & 0x18;
		if (flags == 8)
			pdec->nbits = 7;	/* More bits, mean more bits to encode the stream, but better quality */
@@ -355,8 +347,6 @@ int pwc_dec23_init(struct pwc_device *pwc, int type, unsigned char *cmd)
	for (i=0; i<MAX_OUTER_CROP_VALUE; i++)
		pwc_crop_table[MAX_OUTER_CROP_VALUE+256+i] = 255;
#endif

	return 0;
}

/*
@@ -659,12 +649,12 @@ static void DecompressBand23(struct pwc_dec23_private *pdec,
 * src: raw data
 * dst: image output
 */
void pwc_dec23_decompress(const struct pwc_device *pwc,
void pwc_dec23_decompress(struct pwc_device *pdev,
			  const void *src,
			  void *dst)
{
	int bandlines_left, bytes_per_block;
	struct pwc_dec23_private *pdec = pwc->decompress_data;
	struct pwc_dec23_private *pdec = &pdev->dec23;

	/* YUV420P image format */
	unsigned char *pout_planar_y;
@@ -674,23 +664,22 @@ void pwc_dec23_decompress(const struct pwc_device *pwc,

	mutex_lock(&pdec->lock);

	bandlines_left = pwc->height / 4;
	bytes_per_block = pwc->width * 4;
	plane_size = pwc->height * pwc->width;
	bandlines_left = pdev->height / 4;
	bytes_per_block = pdev->width * 4;
	plane_size = pdev->height * pdev->width;

	pout_planar_y = dst;
	pout_planar_u = dst + plane_size;
	pout_planar_v = dst + plane_size + plane_size / 4;

	while (bandlines_left--) {
		DecompressBand23(pwc->decompress_data,
				 src,
		DecompressBand23(pdec, src,
				 pout_planar_y, pout_planar_u, pout_planar_v,
				 pwc->width, pwc->width);
		src += pwc->vbandlength;
				 pdev->width, pdev->width);
		src += pdev->vbandlength;
		pout_planar_y += bytes_per_block;
		pout_planar_u += pwc->width;
		pout_planar_v += pwc->width;
		pout_planar_u += pdev->width;
		pout_planar_v += pdev->width;
	}
	mutex_unlock(&pdec->lock);
}
+3 −3
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@
#ifndef PWC_DEC23_H
#define PWC_DEC23_H

#include "pwc.h"
struct pwc_device;

struct pwc_dec23_private
{
@@ -51,8 +51,8 @@ struct pwc_dec23_private

};

int pwc_dec23_init(struct pwc_device *pwc, int type, unsigned char *cmd);
void pwc_dec23_decompress(const struct pwc_device *pwc,
void pwc_dec23_init(struct pwc_device *pdev, unsigned char *cmd);
void pwc_dec23_decompress(struct pwc_device *pdev,
			  const void *src,
			  void *dst);
#endif
Loading