<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Dirac Video Codec</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <h1 align="center" color="#606080"> Dirac - A Video Codec </h1> <p align="center"> Created by the <a href="http://www.bbc.co.uk">British Broadcasting Corporation</a>. </p> <hr> <!-- Generated by Doxygen 1.5.9 --> <h1>motion.h</h1><a href="a00200.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* ***** BEGIN LICENSE BLOCK *****</span> <a name="l00002"></a>00002 <span class="comment">*</span> <a name="l00003"></a>00003 <span class="comment">* $Id: motion.h,v 1.30 2008/10/01 01:26:47 asuraparaju Exp $ $Name: Dirac_1_0_2 $</span> <a name="l00004"></a>00004 <span class="comment">*</span> <a name="l00005"></a>00005 <span class="comment">* Version: MPL 1.1/GPL 2.0/LGPL 2.1</span> <a name="l00006"></a>00006 <span class="comment">*</span> <a name="l00007"></a>00007 <span class="comment">* The contents of this file are subject to the Mozilla Public License</span> <a name="l00008"></a>00008 <span class="comment">* Version 1.1 (the "License"); you may not use this file except in compliance</span> <a name="l00009"></a>00009 <span class="comment">* with the License. You may obtain a copy of the License at</span> <a name="l00010"></a>00010 <span class="comment">* http://www.mozilla.org/MPL/</span> <a name="l00011"></a>00011 <span class="comment">*</span> <a name="l00012"></a>00012 <span class="comment">* Software distributed under the License is distributed on an "AS IS" basis,</span> <a name="l00013"></a>00013 <span class="comment">* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for</span> <a name="l00014"></a>00014 <span class="comment">* the specific language governing rights and limitations under the License.</span> <a name="l00015"></a>00015 <span class="comment">*</span> <a name="l00016"></a>00016 <span class="comment">* The Original Code is BBC Research and Development code.</span> <a name="l00017"></a>00017 <span class="comment">*</span> <a name="l00018"></a>00018 <span class="comment">* The Initial Developer of the Original Code is the British Broadcasting</span> <a name="l00019"></a>00019 <span class="comment">* Corporation.</span> <a name="l00020"></a>00020 <span class="comment">* Portions created by the Initial Developer are Copyright (C) 2004.</span> <a name="l00021"></a>00021 <span class="comment">* All Rights Reserved.</span> <a name="l00022"></a>00022 <span class="comment">*</span> <a name="l00023"></a>00023 <span class="comment">* Contributor(s): Thomas Davies (Original Author),</span> <a name="l00024"></a>00024 <span class="comment">* Chris Bowley,</span> <a name="l00025"></a>00025 <span class="comment">* Tim Borer</span> <a name="l00026"></a>00026 <span class="comment">*</span> <a name="l00027"></a>00027 <span class="comment">* Alternatively, the contents of this file may be used under the terms of</span> <a name="l00028"></a>00028 <span class="comment">* the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser</span> <a name="l00029"></a>00029 <span class="comment">* Public License Version 2.1 (the "LGPL"), in which case the provisions of</span> <a name="l00030"></a>00030 <span class="comment">* the GPL or the LGPL are applicable instead of those above. If you wish to</span> <a name="l00031"></a>00031 <span class="comment">* allow use of your version of this file only under the terms of the either</span> <a name="l00032"></a>00032 <span class="comment">* the GPL or LGPL and not to allow others to use your version of this file</span> <a name="l00033"></a>00033 <span class="comment">* under the MPL, indicate your decision by deleting the provisions above</span> <a name="l00034"></a>00034 <span class="comment">* and replace them with the notice and other provisions required by the GPL</span> <a name="l00035"></a>00035 <span class="comment">* or LGPL. If you do not delete the provisions above, a recipient may use</span> <a name="l00036"></a>00036 <span class="comment">* your version of this file under the terms of any one of the MPL, the GPL</span> <a name="l00037"></a>00037 <span class="comment">* or the LGPL.</span> <a name="l00038"></a>00038 <span class="comment">* ***** END LICENSE BLOCK ***** */</span> <a name="l00039"></a>00039 <a name="l00040"></a>00040 <span class="preprocessor">#include <<a class="code" href="a00171.html">libdirac_common/common.h</a>></span> <a name="l00041"></a>00041 <span class="preprocessor">#include <algorithm></span> <a name="l00042"></a>00042 <span class="preprocessor">#ifndef _MOTION_H</span> <a name="l00043"></a>00043 <span class="preprocessor"></span><span class="preprocessor">#define _MOTION_H</span> <a name="l00044"></a>00044 <span class="preprocessor"></span> <a name="l00045"></a>00045 <span class="keyword">namespace </span>dirac <a name="l00046"></a>00046 { <a name="l00048"></a>00048 <span class="comment">//classes and functions for motion estimation and compensation//</span> <a name="l00050"></a>00050 <span class="comment"></span> <a name="l00051"></a>00051 <span class="comment">//classes</span> <a name="l00052"></a>00052 <a name="l00054"></a><a class="code" href="a00234.html#96972fd3f02bb2b4dedee98363564c6c47236624b4df1aea786eb11567c22cde">00054</a> <span class="keyword">enum</span> <a class="code" href="a00234.html#96972fd3f02bb2b4dedee98363564c6c" title="Horizontal or vertical.">MvElement</a> { <a class="code" href="a00234.html#96972fd3f02bb2b4dedee98363564c6c4f862ba901339c0f6797d67d38717bdb">HORIZONTAL</a> , <a class="code" href="a00234.html#96972fd3f02bb2b4dedee98363564c6c47236624b4df1aea786eb11567c22cde">VERTICAL</a> }; <a name="l00055"></a>00055 <a name="l00057"></a>00057 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00058"></a><a class="code" href="a00091.html">00058</a> <span class="keyword">class </span><a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector</a> <a name="l00059"></a>00059 { <a name="l00060"></a>00060 <span class="keyword">public</span>: <a name="l00061"></a>00061 <a name="l00063"></a><a class="code" href="a00091.html#57e08db27981698cd2c3dd571e9ec028">00063</a> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a>(T a, T b) : <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>(a), <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>(b) {}; <a name="l00065"></a><a class="code" href="a00091.html#0c31453906a82091018e27859a58ef0d">00065</a> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a>() : <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>(0), <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>(0) {}; <a name="l00067"></a>00067 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a>(T a) : <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>(a), <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>(a) {}; <a name="l00068"></a>00068 <a name="l00070"></a>00070 <span class="keyword">inline</span> MotionVector<T> <a class="code" href="a00091.html#800a143b3d86016c1c92407aa455ad96" title="Addition.">operator+</a>(<span class="keyword">const</span> MotionVector<T>& argument) <span class="keyword">const</span>; <a name="l00071"></a>00071 <a name="l00073"></a>00073 <span class="keyword">inline</span> MotionVector<T> <a class="code" href="a00091.html#07789928f1437f812ede5c76139e05e0" title="Subtraction.">operator-</a>(<span class="keyword">const</span> MotionVector<T>& argument) <span class="keyword">const</span>; <a name="l00074"></a>00074 <a name="l00076"></a>00076 <span class="keyword">inline</span> MotionVector<T> <a class="code" href="a00091.html#ba36b0918efe2150e980958e6c28bb79" title="Scalar multiplication.">operator*</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> argument) <span class="keyword">const</span>; <a name="l00077"></a>00077 <a name="l00079"></a>00079 <span class="keyword">inline</span> MotionVector<T> <a class="code" href="a00091.html#ba36b0918efe2150e980958e6c28bb79" title="Scalar multiplication.">operator*</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> argument) <span class="keyword">const</span>; <a name="l00080"></a>00080 <a name="l00082"></a>00082 <span class="keyword">inline</span> MotionVector<T> <a class="code" href="a00091.html#ddd3208740623570003d06bd9d136f72" title="Bitshift of each component.">operator<<</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> argument) <span class="keyword">const</span>; <a name="l00083"></a>00083 <a name="l00085"></a>00085 <span class="keyword">inline</span> MotionVector<T> <a class="code" href="a00091.html#aaa992f4e082d32a0155435dbc59d8ff" title="Bitshift of each component.">operator>></a>(<span class="keyword">const</span> <span class="keywordtype">int</span> argument) <span class="keyword">const</span>; <a name="l00086"></a>00086 <a name="l00088"></a><a class="code" href="a00091.html#47c6cbf41bcfd1dddb319fadd37f0db0">00088</a> T& <a class="code" href="a00091.html#47c6cbf41bcfd1dddb319fadd37f0db0" title="Array-style element access.">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> pos){<span class="keywordflow">return</span> ( ( pos==0) ? <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> : <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> );} <a name="l00089"></a>00089 <a name="l00091"></a><a class="code" href="a00091.html#5715655df950536aa6c98a95e076d56e">00091</a> <span class="keyword">const</span> T& <a class="code" href="a00091.html#5715655df950536aa6c98a95e076d56e" title="Array-style element access.">operator[]</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> pos)<span class="keyword"> const </span>{<span class="keywordflow">return</span> ( ( pos==0) ? <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> : <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> );} <a name="l00092"></a>00092 <a name="l00093"></a>00093 <a name="l00095"></a><a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">00095</a> T <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>,<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>; <a name="l00096"></a>00096 <a name="l00097"></a>00097 }; <a name="l00098"></a>00098 <a name="l00099"></a>00099 <a name="l00100"></a>00100 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00101"></a><a class="code" href="a00091.html#800a143b3d86016c1c92407aa455ad96">00101</a> <span class="keyword">inline</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> <a class="code" href="a00091.html#800a143b3d86016c1c92407aa455ad96" title="Addition.">MotionVector<T>::operator+</a>(<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a>& argument)<span class="keyword"> const </span> <a name="l00102"></a>00102 <span class="keyword"> </span>{ <a name="l00103"></a>00103 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> temp; <a name="l00104"></a>00104 temp.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> = <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> + argument.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>; <a name="l00105"></a>00105 temp.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> = <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> + argument.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>; <a name="l00106"></a>00106 <a name="l00107"></a>00107 <span class="keywordflow">return</span> temp; <a name="l00108"></a>00108 } <a name="l00109"></a>00109 <a name="l00110"></a>00110 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00111"></a><a class="code" href="a00091.html#07789928f1437f812ede5c76139e05e0">00111</a> <span class="keyword">inline</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> <a class="code" href="a00091.html#07789928f1437f812ede5c76139e05e0" title="Subtraction.">MotionVector<T>::operator-</a>(<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a>& argument)<span class="keyword"> const </span> <a name="l00112"></a>00112 <span class="keyword"> </span>{ <a name="l00113"></a>00113 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> temp; <a name="l00114"></a>00114 temp.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> = <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>-argument.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>; <a name="l00115"></a>00115 temp.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> = <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>-argument.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>; <a name="l00116"></a>00116 <a name="l00117"></a>00117 <span class="keywordflow">return</span> temp; <a name="l00118"></a>00118 } <a name="l00119"></a>00119 <a name="l00120"></a>00120 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00121"></a><a class="code" href="a00091.html#ba36b0918efe2150e980958e6c28bb79">00121</a> <span class="keyword">inline</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> <a class="code" href="a00091.html#ba36b0918efe2150e980958e6c28bb79" title="Scalar multiplication.">MotionVector<T>::operator*</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> argument)<span class="keyword"> const </span> <a name="l00122"></a>00122 <span class="keyword"> </span>{ <a name="l00123"></a>00123 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> temp; <a name="l00124"></a>00124 temp.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> = <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>*argument; <a name="l00125"></a>00125 temp.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> = <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>*argument; <a name="l00126"></a>00126 <a name="l00127"></a>00127 <span class="keywordflow">return</span> temp; <a name="l00128"></a>00128 } <a name="l00129"></a>00129 <a name="l00130"></a>00130 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00131"></a><a class="code" href="a00091.html#be57bdc18564a54224210c00339de838">00131</a> <span class="keyword">inline</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> <a class="code" href="a00091.html#ba36b0918efe2150e980958e6c28bb79" title="Scalar multiplication.">MotionVector<T>::operator*</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> argument)<span class="keyword"> const </span> <a name="l00132"></a>00132 <span class="keyword"> </span>{ <a name="l00133"></a>00133 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> temp; <a name="l00134"></a>00134 temp.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> = <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>*argument; <a name="l00135"></a>00135 temp.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> = <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>*argument; <a name="l00136"></a>00136 <a name="l00137"></a>00137 <span class="keywordflow">return</span> temp; <a name="l00138"></a>00138 } <a name="l00139"></a>00139 <a name="l00140"></a>00140 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00141"></a><a class="code" href="a00091.html#ddd3208740623570003d06bd9d136f72">00141</a> <span class="keyword">inline</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> <a class="code" href="a00091.html#ddd3208740623570003d06bd9d136f72" title="Bitshift of each component.">MotionVector<T>::operator<<</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> argument)<span class="keyword"> const </span> <a name="l00142"></a>00142 <span class="keyword"> </span>{ <a name="l00143"></a>00143 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> temp; <a name="l00144"></a>00144 temp.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> = <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a><<argument; <a name="l00145"></a>00145 temp.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> = <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a><<argument; <a name="l00146"></a>00146 <a name="l00147"></a>00147 <span class="keywordflow">return</span> temp; <a name="l00148"></a>00148 } <a name="l00149"></a>00149 <a name="l00150"></a>00150 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00151"></a><a class="code" href="a00091.html#aaa992f4e082d32a0155435dbc59d8ff">00151</a> <span class="keyword">inline</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> <a class="code" href="a00091.html#aaa992f4e082d32a0155435dbc59d8ff" title="Bitshift of each component.">MotionVector<T>::operator>></a>(<span class="keyword">const</span> <span class="keywordtype">int</span> argument)<span class="keyword"> const </span> <a name="l00152"></a>00152 <span class="keyword"> </span>{ <a name="l00153"></a>00153 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> temp; <a name="l00154"></a>00154 temp.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> = <a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>>>argument; <a name="l00155"></a>00155 temp.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a> = <a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>>>argument; <a name="l00156"></a>00156 <a name="l00157"></a>00157 <span class="keywordflow">return</span> temp; <a name="l00158"></a>00158 } <a name="l00159"></a>00159 <a name="l00161"></a>00161 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00162"></a><a class="code" href="a00234.html#96055df832ee7286936db017d9624e69">00162</a> std::ostream & operator<< (std::ostream & stream, MotionVector<T> & mv) <a name="l00163"></a>00163 { <a name="l00164"></a>00164 stream << mv.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a> << <span class="stringliteral">" "</span> << mv.y; <a name="l00165"></a>00165 <a name="l00166"></a>00166 <span class="keywordflow">return</span> stream; <a name="l00167"></a>00167 } <a name="l00168"></a>00168 <a name="l00170"></a>00170 <span class="keyword">template</span> <<span class="keyword">class</span> T> <a name="l00171"></a><a class="code" href="a00234.html#ec252ef50e8c639d75a72fc1045d7f1b">00171</a> std::istream & <a class="code" href="a00234.html#601ef46ed6e25d57ffa6bd41cbe128c5" title="A function for inserting array data.">operator>> </a>(std::istream & stream, <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MotionVector<T></a> & mv) <a name="l00172"></a>00172 { <a name="l00173"></a>00173 stream >> mv.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>; <a name="l00174"></a>00174 stream >> mv.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>; <a name="l00175"></a>00175 <a name="l00176"></a>00176 <span class="keywordflow">return</span> stream; <a name="l00177"></a>00177 } <a name="l00178"></a>00178 <a name="l00180"></a><a class="code" href="a00234.html#7782429895119df12cea135b40666613">00180</a> <span class="keyword">typedef</span> <a class="code" href="a00091.html">MotionVector<int></a> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>; <a name="l00181"></a>00181 <a name="l00183"></a><a class="code" href="a00234.html#caaff47bc8c3f9776ed334351006891e">00183</a> <span class="keyword">typedef</span> <a class="code" href="a00091.html">MotionVector<int></a> <a class="code" href="a00091.html">ImageCoords</a>; <a name="l00184"></a>00184 <a name="l00186"></a><a class="code" href="a00234.html#f7bfef46e009be4bb8670d497278e957">00186</a> <span class="keyword">typedef</span> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">TwoDArray<MVector></a> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">MvArray</a>; <a name="l00187"></a>00187 <a name="l00189"></a><a class="code" href="a00234.html#dc8c140258c96e5f2ada27b424c21031">00189</a> <span class="keyword">typedef</span> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">TwoDArray< MotionVector<float></a> > <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">MvFloatArray</a>; <a name="l00190"></a>00190 <a name="l00192"></a><a class="code" href="a00092.html">00192</a> <span class="keyword">class </span><a class="code" href="a00092.html" title="Class for recording costs derived in motion estimation.">MvCostData</a> <a name="l00193"></a>00193 { <a name="l00194"></a>00194 <span class="keyword">public</span>: <a name="l00196"></a><a class="code" href="a00092.html#57853c0bc5215e6b2ba1f352a150188d">00196</a> <a class="code" href="a00092.html#57853c0bc5215e6b2ba1f352a150188d" title="Constructor.">MvCostData</a>(): <a name="l00197"></a>00197 <a class="code" href="a00092.html#cc52f391d4331d61febff1b508f87e00" title="The Sum of Absolute Differences - easier to compute than Sum-Squared Differences...">SAD</a>(0.0), <a name="l00198"></a>00198 <a class="code" href="a00092.html#4b05d010c0263ac203b1a25ebf3eaa4f" title="The (Lagrangian-weighted) motion vector cost - the difference of a motion vector...">mvcost</a>(0.0), <a name="l00199"></a>00199 <a class="code" href="a00092.html#f6b5feec7a0f2955da6401146ed3efd1" title="Total=SAD+mvcost.">total</a>(0.0){} <a name="l00200"></a>00200 <a name="l00201"></a><a class="code" href="a00092.html#eb0a7c73933716467cd2fdc6bf654943">00201</a> <span class="keywordtype">void</span> <a class="code" href="a00092.html#eb0a7c73933716467cd2fdc6bf654943">SetTotal</a>( <span class="keyword">const</span> <span class="keywordtype">float</span> lambda ){<a class="code" href="a00092.html#f6b5feec7a0f2955da6401146ed3efd1" title="Total=SAD+mvcost.">total</a> = <a class="code" href="a00092.html#cc52f391d4331d61febff1b508f87e00" title="The Sum of Absolute Differences - easier to compute than Sum-Squared Differences...">SAD</a> + lambda*<a class="code" href="a00092.html#4b05d010c0263ac203b1a25ebf3eaa4f" title="The (Lagrangian-weighted) motion vector cost - the difference of a motion vector...">mvcost</a>;} <a name="l00202"></a>00202 <a name="l00204"></a><a class="code" href="a00092.html#cc52f391d4331d61febff1b508f87e00">00204</a> <span class="keywordtype">float</span> <a class="code" href="a00092.html#cc52f391d4331d61febff1b508f87e00" title="The Sum of Absolute Differences - easier to compute than Sum-Squared Differences...">SAD</a>; <a name="l00205"></a>00205 <a name="l00207"></a><a class="code" href="a00092.html#4b05d010c0263ac203b1a25ebf3eaa4f">00207</a> <span class="keywordtype">float</span> <a class="code" href="a00092.html#4b05d010c0263ac203b1a25ebf3eaa4f" title="The (Lagrangian-weighted) motion vector cost - the difference of a motion vector...">mvcost</a>; <a name="l00208"></a>00208 <a name="l00210"></a><a class="code" href="a00092.html#f6b5feec7a0f2955da6401146ed3efd1">00210</a> <span class="keywordtype">float</span> <a class="code" href="a00092.html#f6b5feec7a0f2955da6401146ed3efd1" title="Total=SAD+mvcost.">total</a>; <a name="l00211"></a>00211 }; <a name="l00212"></a>00212 <a name="l00213"></a>00213 <a name="l00215"></a>00215 <a name="l00219"></a><a class="code" href="a00093.html">00219</a> <span class="keyword">class </span><a class="code" href="a00093.html" title="Class for all the motion vector data.">MvData</a> <a name="l00220"></a>00220 { <a name="l00221"></a>00221 <span class="keyword">public</span>: <a name="l00223"></a>00223 <a name="l00228"></a>00228 <a class="code" href="a00093.html#b4c26a9523c6be15e77297849e7a318a" title="Constructor.">MvData</a>( <span class="keyword">const</span> <a class="code" href="a00114.html" title="Structure to hold motion parameters when motion comp is used.">PicturePredParams</a>& predparams , <span class="keyword">const</span> <span class="keywordtype">int</span> num_refs); <a name="l00229"></a>00229 <a name="l00231"></a>00231 <a class="code" href="a00093.html#b39a7c46026a80ff2d440c1daf3dbef8" title="Destructor.">~MvData</a>(); <a name="l00232"></a>00232 <a name="l00234"></a><a class="code" href="a00093.html#8eea47344eb67279f04df04e4114d602">00234</a> <a class="code" href="a00114.html" title="Structure to hold motion parameters when motion comp is used.">PicturePredParams</a>& <a class="code" href="a00093.html#8eea47344eb67279f04df04e4114d602" title="Return a reference to the local picture prediction params.">GetPicPredParams</a>(){<span class="keywordflow">return</span> <a class="code" href="a00093.html#0f777bb13e11da2bdfd3ea144f46d64a">m_predparams</a>;} <a name="l00235"></a>00235 <a name="l00237"></a><a class="code" href="a00093.html#39adb3fe2430ac14519a4771f902c1be">00237</a> <span class="keyword">const</span> <a class="code" href="a00114.html" title="Structure to hold motion parameters when motion comp is used.">PicturePredParams</a>& <a class="code" href="a00093.html#39adb3fe2430ac14519a4771f902c1be" title="Return a reference to the local picture prediction params.">GetPicPredParams</a>()<span class="keyword"> const</span>{<span class="keywordflow">return</span> <a class="code" href="a00093.html#0f777bb13e11da2bdfd3ea144f46d64a">m_predparams</a>;} <a name="l00238"></a>00238 <a name="l00240"></a><a class="code" href="a00093.html#98a11cef52a3a84ce0b3878394a26a9f">00240</a> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">MvArray</a>& <a class="code" href="a00093.html#98a11cef52a3a84ce0b3878394a26a9f" title="Get the MVs for a reference.">Vectors</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id){<span class="keywordflow">return</span> *( <a class="code" href="a00093.html#1cac19f9caab408b39b2a6a472b2135f">m_vectors</a>[ref_id] );} <a name="l00241"></a>00241 <a name="l00243"></a><a class="code" href="a00093.html#418416b2d6fac8850b374439df28af13">00243</a> <span class="keyword">const</span> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">MvArray</a>& <a class="code" href="a00093.html#418416b2d6fac8850b374439df28af13" title="Get the MVs for a reference.">Vectors</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id)<span class="keyword"> const </span>{<span class="keywordflow">return</span> *( <a class="code" href="a00093.html#1cac19f9caab408b39b2a6a472b2135f">m_vectors</a>[ref_id] );} <a name="l00244"></a>00244 <a name="l00246"></a><a class="code" href="a00093.html#a693d823641c046988734f0a2c341763">00246</a> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">MvArray</a>& <a class="code" href="a00093.html#a693d823641c046988734f0a2c341763" title="Get the global MVs for a reference.">GlobalMotionVectors</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id){<span class="keywordflow">return</span> *( <a class="code" href="a00093.html#1527e22453a70c15429ba1f78a5fcb14">m_gm_vectors</a>[ref_id] );} <a name="l00247"></a>00247 <a name="l00249"></a><a class="code" href="a00093.html#1b1a6a567ccc280f2ba032b92572a568">00249</a> <span class="keyword">const</span> <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">MvArray</a>& <a class="code" href="a00093.html#1b1a6a567ccc280f2ba032b92572a568" title="Get the global MVs for a reference.">GlobalMotionVectors</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id)<span class="keyword"> const </span>{<span class="keywordflow">return</span> *( <a class="code" href="a00093.html#1527e22453a70c15429ba1f78a5fcb14">m_gm_vectors</a>[ref_id] );} <a name="l00250"></a>00250 <a name="l00252"></a><a class="code" href="a00093.html#bcabf1afe99ee10e1ee71cdd54cc4486">00252</a> <a class="code" href="a00145.html">TwoDArray<ValueType></a>& <a class="code" href="a00093.html#bcabf1afe99ee10e1ee71cdd54cc4486" title="Get the DC values for each component.">DC</a>(<a class="code" href="a00234.html#39dd89c4c7484412efd87d41548271cd" title="Types of picture component.">CompSort</a> cs){<span class="keywordflow">return</span> *( <a class="code" href="a00093.html#c1524f682b4fdac3166403d6d1722436">m_dc</a>[cs] );} <a name="l00253"></a>00253 <a name="l00255"></a><a class="code" href="a00093.html#903f795cfe3697d3aa1b43194a3f6d16">00255</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<ValueType></a>& <a class="code" href="a00093.html#903f795cfe3697d3aa1b43194a3f6d16" title="Get the DC values for each component.">DC</a>(<a class="code" href="a00234.html#39dd89c4c7484412efd87d41548271cd" title="Types of picture component.">CompSort</a> cs)<span class="keyword"> const </span>{<span class="keywordflow">return</span> *( <a class="code" href="a00093.html#c1524f682b4fdac3166403d6d1722436">m_dc</a>[cs] );} <a name="l00256"></a>00256 <a name="l00258"></a><a class="code" href="a00093.html#42ea670734788298243ddf943042ac02">00258</a> <span class="keyword">const</span> <a class="code" href="a00097.html" title="A template class for one-dimensional arrays.">OneDArray< TwoDArray<ValueType></a>* >& <a class="code" href="a00093.html#42ea670734788298243ddf943042ac02" title="Get a reference to the vector holding component DC values.">DC</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00093.html#c1524f682b4fdac3166403d6d1722436">m_dc</a>;} <a name="l00259"></a>00259 <a name="l00261"></a><a class="code" href="a00093.html#72e63eef4af110fe27b5066043851669">00261</a> <a class="code" href="a00145.html">TwoDArray<PredMode></a>& <a class="code" href="a00093.html#72e63eef4af110fe27b5066043851669" title="Get the block prediction modes.">Mode</a>(){<span class="keywordflow">return</span> <a class="code" href="a00093.html#a182952746692c71f5355d256c6b856a">m_modes</a>;} <a name="l00262"></a>00262 <a name="l00264"></a><a class="code" href="a00093.html#956de56a0db1fe8c4ecc70d9254e1396">00264</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<PredMode></a>& <a class="code" href="a00093.html#956de56a0db1fe8c4ecc70d9254e1396" title="Get the block prediction modes.">Mode</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00093.html#a182952746692c71f5355d256c6b856a">m_modes</a>;} <a name="l00265"></a>00265 <a name="l00267"></a><a class="code" href="a00093.html#b56da34e62674830d50667fd7c7df221">00267</a> <a class="code" href="a00145.html">TwoDArray<int></a>& <a class="code" href="a00093.html#b56da34e62674830d50667fd7c7df221" title="Get the SB split level.">SBSplit</a>(){<span class="keywordflow">return</span> <a class="code" href="a00093.html#427725eb300f7b73aaee67832fb9570a">m_sb_split</a>;} <a name="l00268"></a>00268 <a name="l00270"></a><a class="code" href="a00093.html#e7200799b285c2a0840cae2492f078e4">00270</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<int></a>& <a class="code" href="a00093.html#e7200799b285c2a0840cae2492f078e4" title="Get the SB split level.">SBSplit</a>()<span class="keyword"> const</span>{<span class="keywordflow">return</span> <a class="code" href="a00093.html#427725eb300f7b73aaee67832fb9570a">m_sb_split</a>;} <a name="l00271"></a>00271 <a name="l00273"></a><a class="code" href="a00093.html#a594b1ece2f4b1ccc5bbbc039b7d0a24">00273</a> <a class="code" href="a00097.html">OneDArray<float></a>& <a class="code" href="a00093.html#a594b1ece2f4b1ccc5bbbc039b7d0a24" title="Get the global motion model parameters.">GlobalMotionParameters</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id) { <span class="keywordflow">return</span> *( <a class="code" href="a00093.html#c0ec66d9ce51604be7cc47cc402133f2">m_gm_params</a>[ref_id] ); } <a name="l00274"></a>00274 <a name="l00276"></a><a class="code" href="a00093.html#1e9a3b9aa80a89fcbad35faca1964af4">00276</a> <span class="keyword">const</span> <a class="code" href="a00097.html">OneDArray<float></a>& <a class="code" href="a00093.html#1e9a3b9aa80a89fcbad35faca1964af4" title="Get the global motion model parameters.">GlobalMotionParameters</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *( <a class="code" href="a00093.html#c0ec66d9ce51604be7cc47cc402133f2">m_gm_params</a>[ref_id] ); } <a name="l00277"></a>00277 <a name="l00278"></a>00278 <span class="keyword">protected</span>: <a name="l00279"></a>00279 <span class="comment">// A local copy of the picture prediction parameters</span> <a name="l00280"></a><a class="code" href="a00093.html#0f777bb13e11da2bdfd3ea144f46d64a">00280</a> <a class="code" href="a00114.html" title="Structure to hold motion parameters when motion comp is used.">PicturePredParams</a> <a class="code" href="a00093.html#0f777bb13e11da2bdfd3ea144f46d64a">m_predparams</a>; <a name="l00281"></a>00281 <a name="l00282"></a>00282 <span class="comment">// Initialises the arrays of data</span> <a name="l00283"></a>00283 <span class="keywordtype">void</span> <a class="code" href="a00093.html#ddb6fca49e5b5eb8dc0cb4d8204c5119">InitMvData</a>(); <a name="l00284"></a>00284 <a name="l00285"></a>00285 <span class="comment">// The motion vectors</span> <a name="l00286"></a><a class="code" href="a00093.html#1cac19f9caab408b39b2a6a472b2135f">00286</a> <a class="code" href="a00097.html">OneDArray<MvArray*></a> <a class="code" href="a00093.html#1cac19f9caab408b39b2a6a472b2135f">m_vectors</a>; <a name="l00287"></a>00287 <a name="l00288"></a>00288 <span class="comment">// The global motion vectors</span> <a name="l00289"></a><a class="code" href="a00093.html#1527e22453a70c15429ba1f78a5fcb14">00289</a> <a class="code" href="a00097.html">OneDArray<MvArray*></a> <a class="code" href="a00093.html#1527e22453a70c15429ba1f78a5fcb14">m_gm_vectors</a>; <a name="l00290"></a>00290 <a name="l00291"></a>00291 <span class="comment">// The block modes</span> <a name="l00292"></a><a class="code" href="a00093.html#a182952746692c71f5355d256c6b856a">00292</a> <a class="code" href="a00145.html">TwoDArray<PredMode></a> <a class="code" href="a00093.html#a182952746692c71f5355d256c6b856a">m_modes</a>; <a name="l00293"></a>00293 <a name="l00294"></a>00294 <span class="comment">// The DC values</span> <a name="l00295"></a><a class="code" href="a00093.html#c1524f682b4fdac3166403d6d1722436">00295</a> <a class="code" href="a00097.html" title="A template class for one-dimensional arrays.">OneDArray< TwoDArray<ValueType></a>* > <a class="code" href="a00093.html#c1524f682b4fdac3166403d6d1722436">m_dc</a>; <a name="l00296"></a>00296 <a name="l00297"></a>00297 <span class="comment">// The SB split levels</span> <a name="l00298"></a><a class="code" href="a00093.html#427725eb300f7b73aaee67832fb9570a">00298</a> <a class="code" href="a00145.html">TwoDArray<int></a> <a class="code" href="a00093.html#427725eb300f7b73aaee67832fb9570a">m_sb_split</a>; <a name="l00299"></a>00299 <a name="l00300"></a>00300 <span class="comment">// Global motion model parameters</span> <a name="l00301"></a><a class="code" href="a00093.html#c0ec66d9ce51604be7cc47cc402133f2">00301</a> <a class="code" href="a00097.html" title="A template class for one-dimensional arrays.">OneDArray< OneDArray<float></a>* > <a class="code" href="a00093.html#c0ec66d9ce51604be7cc47cc402133f2">m_gm_params</a>; <a name="l00302"></a>00302 <a name="l00303"></a>00303 <span class="comment">// // Number of reference frames</span> <a name="l00304"></a>00304 <span class="comment">// unsigned int m_num_refs;</span> <a name="l00305"></a>00305 }; <a name="l00306"></a>00306 <a name="l00308"></a>00308 <a name="l00313"></a><a class="code" href="a00082.html">00313</a> <span class="keyword">class </span><a class="code" href="a00082.html" title="Class for all the motion estimation data.">MEData</a>: <span class="keyword">public</span> <a class="code" href="a00093.html" title="Class for all the motion vector data.">MvData</a> <a name="l00314"></a>00314 { <a name="l00315"></a>00315 <span class="keyword">public</span>: <a name="l00316"></a>00316 <a name="l00318"></a>00318 <a name="l00323"></a>00323 <a class="code" href="a00082.html#5bef607127b337e1ead12a861ad6843d" title="Constructor.">MEData</a>( <span class="keyword">const</span> <a class="code" href="a00114.html" title="Structure to hold motion parameters when motion comp is used.">PicturePredParams</a>& predparams , <span class="keyword">const</span> <span class="keywordtype">int</span> num_refs = 2); <a name="l00324"></a>00324 <a name="l00326"></a>00326 <a class="code" href="a00082.html#6f03198f31a99511a74fac9288c2ad2a" title="Destructor.">~MEData</a>(); <a name="l00327"></a>00327 <a name="l00329"></a>00329 <span class="keywordtype">void</span> <a class="code" href="a00082.html#ea163a975a5fcea26d165bc9136045ec" title="drop the data relating to one reference">DropRef</a>( <span class="keywordtype">int</span> ref_index ); <a name="l00330"></a>00330 <a name="l00332"></a><a class="code" href="a00082.html#d8fd647b7f7d2b0361ddd621c2d952f7">00332</a> <a class="code" href="a00145.html">TwoDArray<MvCostData></a>& <a class="code" href="a00082.html#d8fd647b7f7d2b0361ddd621c2d952f7" title="Get the block cost structures for each reference.">PredCosts</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id){ <span class="keywordflow">return</span> *( <a class="code" href="a00082.html#327024396538d0426d7eeecc220b4062">m_pred_costs</a>[ref_id] ); } <a name="l00333"></a>00333 <a name="l00335"></a><a class="code" href="a00082.html#7cf176b08eed4fb96c17480b1258a048">00335</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<MvCostData></a>& <a class="code" href="a00082.html#7cf176b08eed4fb96c17480b1258a048" title="Get the block cost structures for each reference.">PredCosts</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *( <a class="code" href="a00082.html#327024396538d0426d7eeecc220b4062">m_pred_costs</a>[ref_id] ); } <a name="l00336"></a>00336 <a name="l00338"></a><a class="code" href="a00082.html#f5648baf20bf0e052eb5a2369b55210d">00338</a> <a class="code" href="a00145.html">TwoDArray<float></a>& <a class="code" href="a00082.html#f5648baf20bf0e052eb5a2369b55210d" title="Get the intra costs.">IntraCosts</a>(){ <span class="keywordflow">return</span> <a class="code" href="a00082.html#835c96794dfad2546c3593b4dddb23a4">m_intra_costs</a>; } <a name="l00339"></a>00339 <a name="l00341"></a><a class="code" href="a00082.html#c688db8982842ccb9073b60f5b7cb5d1">00341</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<float></a>& <a class="code" href="a00082.html#c688db8982842ccb9073b60f5b7cb5d1" title="Get the intra costs.">IntraCosts</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00082.html#835c96794dfad2546c3593b4dddb23a4">m_intra_costs</a>; } <a name="l00342"></a>00342 <a name="l00344"></a><a class="code" href="a00082.html#f384de311b4d17bf5bd7428f4b2f3ad7">00344</a> <a class="code" href="a00145.html">TwoDArray<MvCostData></a>& <a class="code" href="a00082.html#f384de311b4d17bf5bd7428f4b2f3ad7" title="Get the bipred costs.">BiPredCosts</a>(){ <span class="keywordflow">return</span> <a class="code" href="a00082.html#5f9db04e415f1525ffbe93178ae948bd">m_bipred_costs</a>; } <a name="l00345"></a>00345 <a name="l00347"></a><a class="code" href="a00082.html#80274a5a234ebfaa55fee70de2a958aa">00347</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<MvCostData></a>& <a class="code" href="a00082.html#80274a5a234ebfaa55fee70de2a958aa" title="Get the bipred costs.">BiPredCosts</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00082.html#5f9db04e415f1525ffbe93178ae948bd">m_bipred_costs</a>; } <a name="l00348"></a>00348 <a name="l00350"></a><a class="code" href="a00082.html#ba58d2747a4f986bfac506bde407399b">00350</a> <a class="code" href="a00145.html">TwoDArray<float></a>& <a class="code" href="a00082.html#ba58d2747a4f986bfac506bde407399b" title="Get the SB costs.">SBCosts</a>(){ <span class="keywordflow">return</span> <a class="code" href="a00082.html#9684c90d6eee757b29fdc77c9dead855">m_SB_costs</a>; } <a name="l00351"></a>00351 <a name="l00353"></a><a class="code" href="a00082.html#8ae76dff0ee3bc62c370d3531da69121">00353</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<float></a>& <a class="code" href="a00082.html#8ae76dff0ee3bc62c370d3531da69121" title="Get the SB costs.">SBCosts</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00082.html#9684c90d6eee757b29fdc77c9dead855">m_SB_costs</a>; } <a name="l00354"></a>00354 <a name="l00356"></a><a class="code" href="a00082.html#05b797daebef16f89cdf5ee0f882c3cc">00356</a> <span class="keywordtype">float</span> <a class="code" href="a00082.html#05b797daebef16f89cdf5ee0f882c3cc" title="Get the proportion of intra blocks.">IntraBlockRatio</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="a00082.html#01f9623a1ebe53d23019049eb2cf595d">m_intra_block_ratio</a>; } <a name="l00357"></a>00357 <a name="l00359"></a><a class="code" href="a00082.html#99963147fb52607b4536dff4d5e4dac7">00359</a> <span class="keywordtype">void</span> <a class="code" href="a00082.html#99963147fb52607b4536dff4d5e4dac7" title="Set the intra block ratio.">SetIntraBlockRatio</a>(<span class="keyword">const</span> <span class="keywordtype">float</span> r){ <a class="code" href="a00082.html#01f9623a1ebe53d23019049eb2cf595d">m_intra_block_ratio</a> = r; } <a name="l00360"></a>00360 <a name="l00362"></a>00362 <span class="keywordtype">void</span> <a class="code" href="a00082.html#b8c01186029c0f35a62f18bb3378c863" title="Set up the lambda map by detecting motion discontinuities.">SetLambdaMap</a>( <span class="keyword">const</span> <span class="keywordtype">int</span> num_refs , <span class="keyword">const</span> <span class="keywordtype">float</span> lambda ); <a name="l00363"></a>00363 <a name="l00365"></a>00365 <span class="keywordtype">void</span> <a class="code" href="a00082.html#b8c01186029c0f35a62f18bb3378c863" title="Set up the lambda map by detecting motion discontinuities.">SetLambdaMap</a>( <span class="keyword">const</span> <span class="keywordtype">int</span> level , <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<float></a>& l_map , <span class="keyword">const</span> <span class="keywordtype">float</span> wt ); <a name="l00366"></a>00366 <a name="l00368"></a><a class="code" href="a00082.html#7084fa503bad1a67fcf65abdffbc22b0">00368</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<float></a>& <a class="code" href="a00082.html#7084fa503bad1a67fcf65abdffbc22b0" title="Get a lambda value for a given block and level.">LambdaMap</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="a00082.html#339575dcc83177d9f5ee601abb3c76d6">m_lambda_map</a>; } <a name="l00369"></a>00369 <a name="l00371"></a><a class="code" href="a00082.html#689fb907cad3fb336bcee791227383a7">00371</a> <a class="code" href="a00145.html">TwoDArray<int></a>& <a class="code" href="a00082.html#689fb907cad3fb336bcee791227383a7" title="Get the inliers for each reference.">GlobalMotionInliers</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id){ <span class="keywordflow">return</span> *( <a class="code" href="a00082.html#fe1293cd17e436af2e8c5726b5fac4ab">m_inliers</a>[ref_id] ); } <a name="l00372"></a>00372 <a name="l00374"></a><a class="code" href="a00082.html#6ccfe6f14ff3f507cf773b7c954d677d">00374</a> <span class="keyword">const</span> <a class="code" href="a00145.html">TwoDArray<int></a>& <a class="code" href="a00082.html#6ccfe6f14ff3f507cf773b7c954d677d" title="Get the inliers for each reference.">GlobalMotionInliers</a>(<span class="keyword">const</span> <span class="keywordtype">int</span> ref_id)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> *( <a class="code" href="a00082.html#fe1293cd17e436af2e8c5726b5fac4ab">m_inliers</a>[ref_id] ); } <a name="l00375"></a>00375 <a name="l00377"></a>00377 <span class="keyword">friend</span> std::ostream &<a class="code" href="a00082.html#2b21c19b3b9e8cbb6ddd64e78404d113" title="Overloaded operator&lt;&lt; for outputing to (file) stream.">operator<< </a>(std::ostream & stream, <a class="code" href="a00082.html" title="Class for all the motion estimation data.">MEData</a> & me_data); <a name="l00378"></a>00378 <a name="l00380"></a>00380 <span class="keyword">friend</span> std::istream &<a class="code" href="a00082.html#98c23078166a1b28c4a62e756e5d01cc" title="Overloaded operator&gt;&gt; for input of data from (file) stream.">operator>> </a>(std::istream & stream, <a class="code" href="a00082.html" title="Class for all the motion estimation data.">MEData</a> & me_data); <a name="l00381"></a>00381 <a name="l00382"></a>00382 <span class="keyword">private</span>: <a name="l00383"></a>00383 <span class="comment">// Initialises the arrays of data</span> <a name="l00384"></a>00384 <span class="keywordtype">void</span> <a class="code" href="a00082.html#3d2590ac03921758fb2aeb3ff50b8342">InitMEData</a>(); <a name="l00385"></a>00385 <a name="l00386"></a>00386 <span class="comment">// Finds transitions in the motion vectors</span> <a name="l00387"></a>00387 <span class="keywordtype">void</span> <a class="code" href="a00082.html#e09cee21626a575fa68fb49383418e2b">FindTransitions</a>( <a class="code" href="a00145.html" title="A template class for two-dimensional arrays.">TwoDArray<bool></a>& trans_map , <span class="keyword">const</span> <span class="keywordtype">int</span> ref_num ); <a name="l00388"></a>00388 <a name="l00389"></a>00389 <span class="comment">// The costs of predicting each block, for each reference</span> <a name="l00390"></a><a class="code" href="a00082.html#327024396538d0426d7eeecc220b4062">00390</a> <a class="code" href="a00097.html" title="A template class for one-dimensional arrays.">OneDArray< TwoDArray<MvCostData></a>* > <a class="code" href="a00082.html#327024396538d0426d7eeecc220b4062">m_pred_costs</a>; <a name="l00391"></a>00391 <a name="l00392"></a>00392 <span class="comment">// The costs of predicting each block by DC</span> <a name="l00393"></a><a class="code" href="a00082.html#835c96794dfad2546c3593b4dddb23a4">00393</a> <a class="code" href="a00145.html">TwoDArray<float></a> <a class="code" href="a00082.html#835c96794dfad2546c3593b4dddb23a4">m_intra_costs</a>; <a name="l00394"></a>00394 <a name="l00395"></a>00395 <span class="comment">// The costs of predicting each block bidirectionally</span> <a name="l00396"></a><a class="code" href="a00082.html#5f9db04e415f1525ffbe93178ae948bd">00396</a> <a class="code" href="a00145.html">TwoDArray<MvCostData></a> <a class="code" href="a00082.html#5f9db04e415f1525ffbe93178ae948bd">m_bipred_costs</a>; <a name="l00397"></a>00397 <a name="l00398"></a>00398 <span class="comment">// The costs for each macroblock as a whole</span> <a name="l00399"></a><a class="code" href="a00082.html#9684c90d6eee757b29fdc77c9dead855">00399</a> <a class="code" href="a00145.html">TwoDArray<float></a> <a class="code" href="a00082.html#9684c90d6eee757b29fdc77c9dead855">m_SB_costs</a>; <a name="l00400"></a>00400 <a name="l00401"></a>00401 <span class="comment">// A map of the lambda values to use</span> <a name="l00402"></a><a class="code" href="a00082.html#339575dcc83177d9f5ee601abb3c76d6">00402</a> <a class="code" href="a00145.html">TwoDArray<float></a> <a class="code" href="a00082.html#339575dcc83177d9f5ee601abb3c76d6">m_lambda_map</a>; <a name="l00403"></a>00403 <a name="l00404"></a>00404 <span class="comment">// Global motion inliers</span> <a name="l00405"></a><a class="code" href="a00082.html#fe1293cd17e436af2e8c5726b5fac4ab">00405</a> <a class="code" href="a00097.html" title="A template class for one-dimensional arrays.">OneDArray< TwoDArray<int></a>* > <a class="code" href="a00082.html#fe1293cd17e436af2e8c5726b5fac4ab">m_inliers</a>; <a name="l00406"></a>00406 <a name="l00407"></a>00407 <span class="comment">// Intra block ratio</span> <a name="l00408"></a><a class="code" href="a00082.html#01f9623a1ebe53d23019049eb2cf595d">00408</a> <span class="keywordtype">float</span> <a class="code" href="a00082.html#01f9623a1ebe53d23019049eb2cf595d">m_intra_block_ratio</a>; <a name="l00409"></a>00409 <a name="l00410"></a>00410 }; <a name="l00411"></a>00411 <a name="l00412"></a>00412 <span class="comment">//motion estimation and coding stuff</span> <a name="l00413"></a>00413 <a name="l00415"></a>00415 <span class="keywordtype">int</span> <a class="code" href="a00234.html#9ac1cfe6f37daca57b96f4cf42682910" title="Return the median of 3 integers.">Median</a>( <span class="keyword">const</span> <span class="keywordtype">int</span> val1, <span class="keyword">const</span> <span class="keywordtype">int</span> val2, <span class="keyword">const</span> <span class="keywordtype">int</span> val3); <a name="l00416"></a>00416 <a name="l00418"></a>00418 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a> <a class="code" href="a00234.html#627c6c67b838b1017d1c40e635068a5a" title="Return the median of three motion vectors.">MvMedian</a>(<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv1,<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv2,<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv3); <a name="l00419"></a>00419 <a name="l00420"></a>00420 <a name="l00422"></a>00422 <span class="keywordtype">int</span> <a class="code" href="a00234.html#9ac1cfe6f37daca57b96f4cf42682910" title="Return the median of 3 integers.">Median</a>(<span class="keyword">const</span> std::vector<int>& val_list); <a name="l00423"></a>00423 <a name="l00425"></a>00425 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a> <a class="code" href="a00234.html#627c6c67b838b1017d1c40e635068a5a" title="Return the median of three motion vectors.">MvMedian</a>(<span class="keyword">const</span> std::vector<MVector>& vect_list); <a name="l00426"></a>00426 <a name="l00428"></a>00428 <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a> <a class="code" href="a00234.html#5dadb3052be537159f72b9ef0a44fddb" title="Return the mean of two motion vectors.">MvMean</a>(<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv1, <span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv2); <a name="l00429"></a>00429 <a name="l00431"></a><a class="code" href="a00234.html#8922035cd0995a06de4d499571bbe42f">00431</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="a00234.html#8922035cd0995a06de4d499571bbe42f" title="Return the squared length of a motion vector.">Norm2</a>(<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv){<span class="comment">//L^2 norm of a motion vector</span> <a name="l00432"></a>00432 <span class="keywordflow">return</span> mv.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>*mv.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>+mv.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>*mv.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>; <a name="l00433"></a>00433 } <a name="l00434"></a>00434 <a name="l00436"></a><a class="code" href="a00234.html#fa05bdcf95317206a28d2fa53f14d163">00436</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="a00234.html#fa05bdcf95317206a28d2fa53f14d163" title="Return the sum of the lengths of a motion vector&#39;s componets.">Norm1</a>(<span class="keyword">const</span> <a class="code" href="a00091.html" title="Motion vector class - just a pair.">MVector</a>& mv){<span class="comment">//L^1 norm of a motion vector</span> <a name="l00437"></a>00437 <span class="keywordflow">return</span> abs(mv.<a class="code" href="a00091.html#2d621e73454d40917e4c765175f0b15f" title="x and y components">x</a>)+abs(mv.<a class="code" href="a00091.html#121d0b360a1678c750f17b810b5f15f2">y</a>); <a name="l00438"></a>00438 } <a name="l00439"></a>00439 <a name="l00441"></a>00441 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="a00234.html#66649bcd754d54d2ee4c65010f827415" title="Return the mean of a set of unsigned integer values.">GetUMean</a>(std::vector<unsigned int>& values); <a name="l00442"></a>00442 <a name="l00444"></a>00444 <span class="keywordtype">int</span> <a class="code" href="a00234.html#ca1824fa04de660ffbfab20ec2200cf6" title="Return the mean of a set of signed integer values.">GetSMean</a>(std::vector<int>& values); <a name="l00445"></a>00445 <a name="l00446"></a>00446 } <span class="comment">// namespace dirac</span> <a name="l00447"></a>00447 <a name="l00448"></a>00448 <span class="preprocessor">#endif</span> </pre></div></div> <hr> <p align="center"><small> © 2004 British Broadcasting Corporation. Dirac code licensed under the <a href="http://www.mozilla.org/MPL/">Mozilla Public License (MPL) Version 1.1</a>.<br> HTML documentation generated by Dimitri van Heesch's excellent <a href="http://www.doxygen.org">Doxygen</a> tool. </small></p> </body> </html>