[FFmpeg-devel] GSoC project (JPEG 2000)
rukhsana afroz
rukhsana.afroz at gmail.com
Tue Apr 12 07:32:19 CEST 2011
On Wed, Apr 6, 2011 at 6:35 PM, rukhsana afroz <rukhsana.afroz at gmail.com>wrote:
>
>
> On Wed, Apr 6, 2011 at 9:24 AM, Michael Niedermayer <michaelni at gmx.at>wrote:
>
>> I suspect the If statement is there as the implementation only supports
>> cblk_style==0
>> the others simply are not implemented
>>
>> Do you think you can implement them?
>>
>> Thanks Michael for your reply. I read the specification once. I believe, I
> will be able to implement existing missing features of decoder. Later on, I
> can work on encoder once I know the JPEG 2000 coding standard thoroughly. I
> will submit my SoC application tonight, or tomorrow morning.
>
> Thanks
> Ruby
>
>
I have found what to do for particularly this missing feature. It looks
like, parameters have been defined for all values of cblk_style in j2k.h
file.
// Codeblock coding styles
#define J2K_CBLK_BYPASS 0x01 // Selective arithmetic coding bypass
#define J2K_CBLK_RESET 0x02 // Reset context probabilities
#define J2K_CBLK_TERMALL 0x04 // Terminate after each coding pass
#define J2K_CBLK_VSC 0x08 // Vertical stripe causal context formation
#define J2K_CBLK_PREDTERM 0x10 // Predictable termination
#define J2K_CBLK_SEGSYM 0x20 // Segmentation symbols present
Specification also says, these are the at most number of code block styles.
These cblk_style is used while decoding the a particular code block (which
is resided inside one band, one component-tile contains a number of bands,
one tile is subdivided again into a number of component-tiles, entire
codestream consists of a number of tiles). From the code, i see only the
code block style J2K_CBLK_SEGSYM has been implemented. When code block style
is zero, no action has been taken and it is default. Logic for this
implementation is in the function decode_cblk and then from there main logic
is in decode_clnpass function.
static int decode_cblk(J2kDecoderContext *s, J2kCodingStyle *codsty,
J2kT1Context *t1, J2kCblk *cblk,
int width, int height, int bandpos)
{
int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1, y;
for (y = 0; y < height+2; y++)
memset(t1->flags[y], 0, (width+2)*sizeof(int));
for (y = 0; y < height; y++)
memset(t1->data[y], 0, width*sizeof(int));
ff_mqc_initdec(&t1->mqc, cblk->data);
cblk->data[cblk->length] = 0xff;
cblk->data[cblk->length+1] = 0xff;
while(passno--){
switch(pass_t){
case 0: decode_sigpass(t1, width, height, bpno+1, bandpos);
break;
case 1: decode_refpass(t1, width, height, bpno+1);
break;
* case 2: decode_clnpass(s, t1, width, height, bpno+1, bandpos,
codsty->cblk_style & J2K_CBLK_SEGSYM);*
break;
}
pass_t++;
if (pass_t == 3){
bpno--;
pass_t = 0;
}
}
return 0;
}
static void decode_clnpass(J2kDecoderContext *s, J2kT1Context *t1, int
width, int height,
int bpno, int bandno, int seg_symbols)
{
int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
for (y0 = 0; y0 < height; y0 += 4) {
for (x = 0; x < width; x++){
if (y0 + 3 < height && !(
(t1->flags[y0+1][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS |
J2K_T1_SIG)) ||
(t1->flags[y0+2][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS |
J2K_T1_SIG)) ||
(t1->flags[y0+3][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS |
J2K_T1_SIG)) ||
(t1->flags[y0+4][x+1] & (J2K_T1_SIG_NB | J2K_T1_VIS |
J2K_T1_SIG)))){
if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
continue;
runlen = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states +
MQC_CX_UNI);
runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
t1->mqc.cx_states + MQC_CX_UNI);
dec = 1;
} else{
runlen = 0;
dec = 0;
}
for (y = y0 + runlen; y < y0 + 4 && y < height; y++){
if (!dec){
if (!(t1->flags[y+1][x+1] & (J2K_T1_SIG | J2K_T1_VIS)))
dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states +
ff_j2k_getnbctxno(t1->flags[y+1][x+1], bandno));
}
if (dec){
int xorbit, ctxno =
ff_j2k_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
t1->data[y][x] = (ff_mqc_decode(&t1->mqc,
t1->mqc.cx_states + ctxno) ^ xorbit) ? -mask : mask;
ff_j2k_set_significant(t1, x, y, t1->data[y][x] < 0);
}
dec = 0;
t1->flags[y+1][x+1] &= ~J2K_T1_VIS;
}
}
}
* if (seg_symbols) {
int val;
val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states +
MQC_CX_UNI);
val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states +
MQC_CX_UNI);
val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states +
MQC_CX_UNI);
if (val != 0xa) {
av_log(s->avctx, AV_LOG_ERROR,"Segmentation symbol value
incorrect\n");
}*
}
}
I am working on the modification to take into account all code block styles.
Please let me know if you have any suggestion. I truly appreciate all of
your helps.
Thanks
--
Rukhsana Ruby
Phd Student
Department of Electrical & Computer Engineering
The University of British Columbia
============================
More information about the ffmpeg-devel
mailing list