Commit 2c875651 authored by Michael Niedermayer's avatar Michael Niedermayer

img2enc: support storing alpha planes too in split plane mode

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent db012e16
...@@ -68,9 +68,10 @@ static int write_header(AVFormatContext *s) ...@@ -68,9 +68,10 @@ static int write_header(AVFormatContext *s)
static int write_packet(AVFormatContext *s, AVPacket *pkt) static int write_packet(AVFormatContext *s, AVPacket *pkt)
{ {
VideoMuxData *img = s->priv_data; VideoMuxData *img = s->priv_data;
AVIOContext *pb[3]; AVIOContext *pb[4];
char filename[1024]; char filename[1024];
AVCodecContext *codec= s->streams[ pkt->stream_index ]->codec; AVCodecContext *codec= s->streams[ pkt->stream_index ]->codec;
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(codec->pix_fmt);
int i; int i;
if (!img->is_pipe) { if (!img->is_pipe) {
...@@ -81,23 +82,22 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -81,23 +82,22 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
img->img_number, img->path); img->img_number, img->path);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
for(i=0; i<3; i++){ for(i=0; i<4; i++){
if (avio_open2(&pb[i], filename, AVIO_FLAG_WRITE, if (avio_open2(&pb[i], filename, AVIO_FLAG_WRITE,
&s->interrupt_callback, NULL) < 0) { &s->interrupt_callback, NULL) < 0) {
av_log(s, AV_LOG_ERROR, "Could not open file : %s\n",filename); av_log(s, AV_LOG_ERROR, "Could not open file : %s\n",filename);
return AVERROR(EIO); return AVERROR(EIO);
} }
if(!img->split_planes) if(!img->split_planes || i+1 >= desc->nb_components)
break; break;
filename[ strlen(filename) - 1 ]= 'U' + i; filename[ strlen(filename) - 1 ]= ((int[]){'U','V','A','x'})[i];
} }
} else { } else {
pb[0] = s->pb; pb[0] = s->pb;
} }
if(img->split_planes){ if(img->split_planes){
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(codec->pix_fmt);
int ysize = codec->width * codec->height; int ysize = codec->width * codec->height;
int usize = ((-codec->width)>>desc->log2_chroma_w) * ((-codec->height)>>desc->log2_chroma_h); int usize = ((-codec->width)>>desc->log2_chroma_w) * ((-codec->height)>>desc->log2_chroma_h);
avio_write(pb[0], pkt->data , ysize); avio_write(pb[0], pkt->data , ysize);
...@@ -105,6 +105,10 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -105,6 +105,10 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt)
avio_write(pb[2], pkt->data + ysize + usize, usize); avio_write(pb[2], pkt->data + ysize + usize, usize);
avio_close(pb[1]); avio_close(pb[1]);
avio_close(pb[2]); avio_close(pb[2]);
if (desc->nb_components > 3) {
avio_write(pb[3], pkt->data + ysize + 2*usize, ysize);
avio_close(pb[3]);
}
}else{ }else{
if(ff_guess_image2_codec(s->filename) == AV_CODEC_ID_JPEG2000){ if(ff_guess_image2_codec(s->filename) == AV_CODEC_ID_JPEG2000){
AVStream *st = s->streams[0]; AVStream *st = s->streams[0];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment