⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lav_common.c

📁 Motion JPEG编解码器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
     break;   }   param->chroma_size = param->chroma_height * param->chroma_width;   buffer[0] = bufalloc(param->luma_size);   buffer[1] = bufalloc(param->chroma_size);   buffer[2] = bufalloc(param->chroma_size);   #ifdef HAVE_LIBDV   dv_frame[0] = bufalloc(3 * param->output_width * param->output_height);   dv_frame[1] = NULL;   dv_frame[2] = NULL;#endif}int readframe(int numframe, 	      uint8_t *frame[],	      LavParam *param,	      EditList el){  int len, i, res, data_format;  uint8_t *frame_tmp;  if (MAX_JPEG_LEN < el.max_frame_size) {    mjpeg_error_exit1( "Max size of JPEG frame = %ld: too big",		       el.max_frame_size);  }    len = el_get_video_frame(jpeg_data, numframe, &el);  data_format = el_video_frame_data_format(numframe, &el);    switch(data_format) {  case DATAFORMAT_DV2 :#ifndef HAVE_LIBDV    mjpeg_error("DV input was not configured at compile time");    res = 1;#else    mjpeg_debug("DV frame %d   len %d",numframe,len);    res = 0;    dv_parse_header(decoder, jpeg_data);    switch(decoder->sampling) {    case e_dv_sample_420:#ifdef LIBDV_PAL_YV12      /* libdv decodes PAL DV directly as planar YUV 420       * (YV12 or 4CC 0x32315659) if configured with the flag       * --with-pal-yuv=YV12 which is not (!) the default       */      pitches[0] = decoder->width;      pitches[1] = decoder->width / 2;      pitches[2] = decoder->width / 2;      if (pitches[0] != param->output_width ||	  pitches[1] != param->chroma_width) {	mjpeg_error("for DV 4:2:0 only full width output is supported");	res = 1;      } else {	dv_decode_full_frame(decoder, jpeg_data, e_dv_color_yuv,			     frame, pitches);	/* swap the U and V components */	frame_tmp = frame[2];	frame[2] = frame[1];	frame[1] = frame_tmp;      }      break;#endif /* LIBDV_PAL_YV12 */    case e_dv_sample_411:    case e_dv_sample_422:      /* libdv decodes NTSC DV (native 411) and by default also PAL       * DV (native 420) as packed YUV 422 (YUY2 or 4CC 0x32595559)       * where the U and V information is repeated.  This can be       * transformed to planar 420 (YV12 or 4CC 0x32315659).       * For NTSC DV this transformation is lossy.       */      pitches[0] = decoder->width * 2;      pitches[1] = 0;      pitches[2] = 0;      if (decoder->width != param->output_width) {	mjpeg_error("for DV only full width output is supported");	res = 1;      } else {	dv_decode_full_frame(decoder, jpeg_data, e_dv_color_yuv,			     dv_frame, pitches);	frame_YUV422_to_planar(frame, dv_frame[0],			       decoder->width,	decoder->height,			       (param->chroma == Y4M_CHROMA_422));      }      break;    default:      res = 1;      break;    }#endif /* HAVE_LIBDV */    break;  case DATAFORMAT_YUV420 :  case DATAFORMAT_YUV422 :    mjpeg_debug("raw YUV frame %d   len %d",numframe,len);    frame_tmp = jpeg_data;    memcpy(frame[0], frame_tmp, param->luma_size);    frame_tmp += param->luma_size;    memcpy(frame[1], frame_tmp, param->chroma_size);    frame_tmp += param->chroma_size;    memcpy(frame[2], frame_tmp, param->chroma_size);    res = 0;    break;  default:    mjpeg_debug("MJPEG frame %d   len %d",numframe,len);    res = decode_jpeg_raw(jpeg_data, len, el.video_inter,			  ((param->chroma == Y4M_CHROMA_422)? CHROMA422:			   CHROMA420),			  param->output_width, param->output_height,			  frame[0], frame[1], frame[2]);  }    if (res) {    mjpeg_warn( "Decoding of Frame %d failed", numframe);    /* TODO: Selective exit here... */    return 1;  }      if (param->mono) {    for (i = 0;	 i < param->chroma_size;	 ++i) {      frame[1][i] = 0x80;      frame[2][i] = 0x80;    }  }  return 0;  }void writeoutYUV4MPEGheader(int out_fd,			    LavParam *param,			    EditList el,			    y4m_stream_info_t *streaminfo){   int n;   y4m_si_set_width(streaminfo, param->output_width);   y4m_si_set_height(streaminfo, param->output_height);   y4m_si_set_interlace(streaminfo, param->interlace);   y4m_si_set_framerate(streaminfo, mpeg_conform_framerate(el.video_fps));   if (!Y4M_RATIO_EQL(param->sar, y4m_sar_UNKNOWN)) {     y4m_si_set_sampleaspect(streaminfo, param->sar);   } else if ((el.video_sar_width != 0) || (el.video_sar_height != 0)) {     y4m_ratio_t sar;     sar.n = el.video_sar_width;     sar.d = el.video_sar_height;     y4m_si_set_sampleaspect(streaminfo, sar);   } else {     /* no idea! ...eh, just guess. */     mjpeg_warn("unspecified sample-aspect-ratio --- taking a guess...");     y4m_si_set_sampleaspect(streaminfo,			     y4m_guess_sar(param->output_width, 					   param->output_height,					   param->dar));   }   switch (el_video_frame_data_format(0, &el)) { /* FIXME: checking only 0-th frame. */   case DATAFORMAT_YUV420:     switch (param->chroma) {     case Y4M_UNKNOWN:     case Y4M_CHROMA_420JPEG:       break;     case Y4M_CHROMA_420MPEG2:     case Y4M_CHROMA_420PALDV:       mjpeg_warn("4:2:0 chroma should be '420jpeg' with this input");       break;     default:       mjpeg_error_exit1("must specify 4:2:0 chroma (should be '420jpeg') with this input");       break;     }     break;   case DATAFORMAT_YUV422:     switch (param->chroma) {     case Y4M_CHROMA_422:       break;     default:       mjpeg_error_exit1("must specify chroma '422' with this input");       break;     }     break;   case DATAFORMAT_DV2:#ifndef HAVE_LIBDV     mjpeg_error_exit1("DV input was not configured at compile time");#else     el_get_video_frame(jpeg_data, 0, &el); /* FIXME: checking only 0-th frame. */     dv_parse_header(decoder, jpeg_data);     switch(decoder->sampling) {     case e_dv_sample_420:# ifndef LIBDV_PAL_YV12       mjpeg_error_exit1("DV PAL YV12 input was not configured at compile time");# else       switch (param->chroma) {       case Y4M_UNKNOWN:	 mjpeg_info("set chroma '420paldv' from imput");	 param->chroma = Y4M_CHROMA_420PALDV;	 break;       case Y4M_CHROMA_420PALDV:	 break;       case Y4M_CHROMA_420JPEG:       case Y4M_CHROMA_420MPEG2:	 mjpeg_warn("4:2:0 chroma should be '420paldv' with this input");	 break;       default:	 mjpeg_error_exit1("must specify 4:2:0 chroma (should be '420paldv') with this input");	 break;       }       break;# endif     case e_dv_sample_411:     case e_dv_sample_422:       if (param->chroma != Y4M_CHROMA_422)	 mjpeg_info("chroma '422' recommended with this input");       switch (param->chroma) {       case Y4M_CHROMA_420MPEG2:       case Y4M_CHROMA_420PALDV:	 mjpeg_warn("4:2:0 chroma should be '420jpeg' with this input");	 break;       }       break;     default:       break;     }#endif     break;   case DATAFORMAT_MJPG:     if (param->chroma != Y4M_CHROMA_422 && el.MJPG_chroma == CHROMA422)       mjpeg_info("chroma '422' recommended with this input");     switch (param->chroma) {     case Y4M_CHROMA_420MPEG2:     case Y4M_CHROMA_420PALDV:       mjpeg_warn("4:2:0 chroma should be '420jpeg' with this input");       break;     }     break;   }   if (param->chroma == Y4M_UNKNOWN) {     mjpeg_info("set default chroma '420jpeg'");     param->chroma = Y4M_CHROMA_420JPEG;   }   y4m_si_set_chroma(streaminfo, param->chroma);   n = y4m_write_stream_header(out_fd, streaminfo);   if (n != Y4M_OK)      mjpeg_error("Failed to write stream header: %s", y4m_strerr(n));}#ifdef HAVE_LIBDVvoid lav_init_dv_decoder(){   decoder = dv_decoder_new(0,0,0);   decoder->quality = DV_QUALITY_BEST;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -