img2enc: support storing alpha planes too in split plane mode
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
db012e161e
commit
2c87565147
@ -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)
|
|||||||
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)
|
|||||||
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];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user