{"record":{"id":"db67cd245db7ae4c","repo":"pion/webrtc","slug":"stream-is-nil","errorCode":null,"errorMessage":"stream is nil","messagePattern":"stream is nil","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/media/h264reader/h264reader.go","lineNumber":25,"sourceCode":"import (\n\t\"bytes\"\n\t\"errors\"\n\t\"io\"\n)\n\n// H264Reader reads data from stream and constructs h264 nal units.\ntype H264Reader struct {\n\tstream                      io.Reader\n\tnalBuffer                   []byte\n\tcountOfConsecutiveZeroBytes int\n\tnalPrefixParsed             bool\n\treadBuffer                  []byte\n\ttmpReadBuf                  []byte\n\tincludeSEI                  bool\n}\n\nvar (\n\terrNilReader           = errors.New(\"stream is nil\")\n\terrDataIsNotH264Stream = errors.New(\"data is not a H264 bitstream\")\n)\n\n// NewReader creates new H264Reader.\nfunc NewReader(in io.Reader) (*H264Reader, error) {\n\tif in == nil {\n\t\treturn nil, errNilReader\n\t}\n\n\treader := &H264Reader{\n\t\tstream:          in,\n\t\tnalBuffer:       make([]byte, 0),\n\t\tnalPrefixParsed: false,\n\t\treadBuffer:      make([]byte, 0),\n\t\ttmpReadBuf:      make([]byte, 4096),\n\t\tincludeSEI:      false,\n\t}\n","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/pion/webrtc/blob/8c25dc09fa9e7c09aac4309ead88093d760432b0/pkg/media/h264reader/h264reader.go#L7-L43","documentation":"This error is returned by h264reader.NewReader when the io.Reader passed in is nil. The H264Reader wraps a reader to parse an H264 Annex-B bitstream; without a source stream there is nothing to read. It is a package-level sentinel (errNilReader) so callers can compare with errors.Is.","triggerScenarios":"Calling h264reader.NewReader(nil), typically when a variable holding the stream is nil because an earlier open/lookup step failed silently.","commonSituations":"Config mistakes where a file path or network source was never opened; a function that returns an io.Reader returning nil on a code path; forgetting to check a producer's error before passing its (nil) result to NewReader.","solutions":["Check that the io.Reader is non-nil before calling NewReader and handle the upstream failure that produced nil.","Compare the returned error with errors.Is(err, h264reader.ErrNilReader-style check) / direct equality to give a clear message.","Return a descriptive error to your caller instead of propagating the bare sentinel."],"exampleFix":"// before\nrdr, err := h264reader.NewReader(getReader())\n// after\nin := getReader()\nif in == nil {\n    return nil, fmt.Errorf(\"no H264 input stream available\")\n}\nrdr, err := h264reader.NewReader(in)","handlingStrategy":"validation","validationCode":"if in == nil {\n    return errors.New(\"h264 input stream is nil\")\n}\nrdr, err := h264reader.NewReader(in)","typeGuard":"func hasReader(r io.Reader) bool { return r != nil }","tryCatchPattern":"rdr, err := h264reader.NewReader(in)\nif err != nil {\n    return fmt.Errorf(\"h264reader init: %w\", err)\n}","preventionTips":["Always check errors from whatever creates the io.Reader before passing it on.","Avoid functions that return a bare nil io.Reader with a nil error.","Validate inputs at API boundaries before constructing media readers."],"tags":["go","media","h264","nil-argument"],"backgroundTag":"nil-reader-argument","analyzedSha":"8c25dc09fa9e7c09aac4309ead88093d760432b0","analyzedAt":"2026-09-03T21:56:56.182Z","contentChangedAt":"2026-09-03T21:56:56.182Z","schemaVersion":2},"datasetVersion":"2026-09-11T07:07:21.782Z"}