2 // MEX-File: dv_extract
\r
4 // uint8 vector msg = dv_extract(uint8 vector stego, int scalar msgLength, int scalar constrLength = 10)
\r
6 typedef unsigned int u32;
\r
7 typedef unsigned short u16;
\r
8 typedef unsigned char u8;
\r
16 #define MATLAB_in_stego 0
\r
17 #define MATLAB_in_msgLength 1
\r
18 #define MATLAB_in_constrLength 2
\r
20 #define MATLAB_out_msg 0
\r
22 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
\r
24 int matrixheight, vectorlength, i, j, k, index, index2, syndromelength, matrixwidth, size[2], base, height;
\r
26 u8 *vector, *syndrome, *closestData, *ssedone, *stepdown, *binmat[2], *msgData;
\r
27 int *matrices, *widths;
\r
35 mexErrMsgTxt("Too few input parameters (2 or 3 expected)");
\r
39 if(!mxIsUint8(prhs[MATLAB_in_stego])) {
\r
40 mexErrMsgTxt("The stego vector must be of type uint8.");
\r
43 vector = (u8*)mxGetPr(prhs[MATLAB_in_stego]);
\r
44 vectorlength = (int)mxGetM(prhs[MATLAB_in_stego]);
\r
46 syndromelength = (int)mxGetScalar(prhs[MATLAB_in_msgLength]);
\r
49 matrixheight = (int)mxGetScalar(prhs[MATLAB_in_constrLength]);
\r
53 // end of matlab interface
\r
55 height = matrixheight;
\r
57 if(matrixheight > 31) {
\r
58 mexErrMsgTxt("Submatrix height must not exceed 31.");
\r
64 int shorter, longer, worm;
\r
67 matrices = (int *)malloc(syndromelength * sizeof(int));
\r
68 widths = (int *)malloc(syndromelength * sizeof(int));
\r
70 invalpha = (double)vectorlength / syndromelength;
\r
72 mexErrMsgTxt("The message cannot be longer than the cover object.\n");
\r
75 shorter = (int)floor(invalpha);
\r
76 longer = (int)ceil(invalpha);
\r
77 if((columns[0] = getMatrix(shorter, matrixheight)) == NULL)
\r
79 if((columns[1] = getMatrix(longer, matrixheight)) == NULL)
\r
82 for(i = 0; i < syndromelength; i++) {
\r
83 if(worm + longer <= (i + 1) * invalpha + 0.5) {
\r
89 widths[i] = shorter;
\r
93 binmat[0] = (u8*)malloc(shorter * matrixheight * sizeof(u8));
\r
94 binmat[1] = (u8*)malloc(longer * matrixheight * sizeof(u8));
\r
95 for(i = 0, index = 0; i < shorter; i++) {
\r
96 for(j = 0; j < matrixheight; j++, index++) {
\r
97 binmat[0][index] = (columns[0][i] & (1 << j)) ? 1 : 0;
\r
100 for(i = 0, index = 0; i < longer; i++) {
\r
101 for(j = 0; j < matrixheight; j++, index++) {
\r
102 binmat[1][index] = (columns[1][i] & (1 << j)) ? 1 : 0;
\r
109 size[0] = syndromelength;
\r
112 msg = mxCreateNumericArray(2, size, mxUINT8_CLASS, mxREAL);
\r
113 msgData = (u8*)mxGetPr(msg);
\r
115 for(i = 0; i < syndromelength; i++) {
\r
119 for(index = 0, index2 = 0; index2 < syndromelength; index2++) {
\r
120 for(k = 0, base = 0; k < widths[index2]; k++, index++, base += matrixheight) {
\r
121 if(vector[index]) {
\r
122 for(i = 0; i < height; i++) {
\r
123 msgData[index2 + i] ^= binmat[matrices[index2]][base + i];
\r
127 if(syndromelength - index2 <= matrixheight)
\r
136 plhs[MATLAB_out_msg] = msg;
\r